AsyncTask的参数介绍
AsyncTask 是轻量级的异步任务类,轻松地在 UI 线程控制后台操作和后台操作所返回结果,无需使用 Thread 和 Handler 这样的组合来进行切换。实际上 AsyncTask 是为我们所设计的关于 Thread 和 Handler 的帮助类。
AsyncTask 是经过 Android 封装、简化的异步任务实现方式,内部实现也是由 Thread 和 Handler 来实现异步任务和切换线程的。
使用:
AsyncTask 的一般使用代码写法形式如下:
private class MyTask extends AsyncTask<Params, Progress, Result> { ... }
MyTask task = new MyTask();
task.execute(Params...) ;
如果我们想要快速弄懂 AsyncTask ,只需明白三个参数和四个步骤即可。
在异步任务中的三个参数如下:
Params: 执行任务时传入的参数类型
Progress: 后台操作执行过程中发回主线程中的阶段性结果返回类型
Result: 后台操作完全结束时返回给主线程的期待的返回类型
在异步任务中被调用四个步骤的顺序如下:
onPreExecute(): 在后台任务即 doInBackground(Params…) 执行前被调用,一般用于初始化某些值,例如可以是在交互页面上显示一个 ProgressBar 来提示将要进行后台任务。
doInBackground(Params…): 它将在 onPreExecute() 被调用后马上调用,后台耗时操作真正是被放在这里执行。这边的可变参数 Params 正是 三个参数 中的第一个参数传入到这边的,另外会在任务执行结束后 return 第三个泛型参数 Result。过程中还可以调用 publishProgress(Progress…) 来发送返回阶段性结果,给处于主线程中调用的 onProgressUpdate(Progress…) 中使用。
onProgressUpdate(Progress…): 它会在执行 publishProgress(Progress…) 后被主线程调用起,这时仍在后台执行的任务会发回一个或多个阶段性进度结果,这个是可以用来去更新交互页面。
onPostExecute(Result):当后台任务完全结束时会在主线程调用,这里的 Result 正是 doInBackground() 的返回值传入。
这些方法中参数包含 … 的,是在 Java 中使用 … 表示参数数量不固定,是一种数组型参数。
AsyncTask<Params, Progress, Result>的三个参数
doInBackground(Params...)
publishProgress(Progress...)
onProgressUpdate(Progress...)
onPostExecute(Result)
看这四个方法的参数你就知道上面的三个参数是给谁用的了!
AsyncTask的四个方法(步骤)
1、onPreExecute():这个方法是在任务开始前进行的,它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。
2、doInBackground(Params...):这个方法是onPreExecute()完成后,立即在后台进行的,用以执行任务,并将Result传给onPostExecute(Result)。另外,在此期间,可以调用publishProgress(Progress...),这个方法能够传递一些数据给onProgressUpdate(Progress...)。
3、onProgressUpdate(Progress...):在被调用之后,此方法会由UI线程调用。所以利用publishProgress(Progress...)publishProgress(Progress...)和onProgressUpdate(Progress...)就能够做出在加载或读取网络数据时的等待或缓冲的UI效果。我在最后给出的效果图有类似的功能。
4、onPostExecute(Result):在doInBackground(Params...)完成后,由UI线程调用,在这里处理Result。
泛型参数可以是任何类型,那多参数怎么传呢?
public class GetCityListTask extends AsyncTask<String, Integer, String> {
public String ResultStr;
///这个方法是onPreExecute()完成后,立即在后台进行的,用以执行任务,并将Result传给onPostExecute(Result)。
///另外,在此期间,可以调用publishProgress(Progress...),这个方法能够传递一些数据给onProgressUpdate(Progress...)。
@Override
protected String doInBackground(String... params) {
String x=params[0];
return null;
}
}
在主线程获取返回值
1 创建一个接口
import java.util.List;
public interface AsyncResponse {
void onDataReceivedSuccess(List<String> listData);
void onDataReceivedFailed();
}
2 在AsyncTask中通过此接口获取到onPostExecute中的数值
class SocketConnAsync extends AsyncTask<String, Void, String>
{
public AsyncResponse asyncResponse;
public void setOnAsyncResponse(AsyncResponse asyncResponse)
{
this.asyncResponse = asyncResponse;
}
@Override
protected String doInBackground(String... params) {
dataReceived = something;
return dataReceived;
}
@Override
protected void onPostExecute(String msg) {
super.onPostExecute(msg);
if (msg != null)
{
List<String> listData = new ArrayList<String>();
listData = parseJsonResponse(msg);//解析msg的一个函数
asyncResponse.onDataReceivedSuccess(listData);//将结果传给回调接口中的函数
}
else {
asyncResponse.onDataReceivedFailed();
}
}
}
3 在Activity中实现此接口即可
public class MainActivity extends Activity
{
private ListView environListView;
private List<String> environmentList = null;//listview上显示的数据源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.listview_environment);
sendRequestForListData();
}
private void sendRequestForListData()
{
try {
final SocketConnAsync socketConn = new SocketConnAsync();
socketConn.execute(params);
socketConn.setOnAsyncResponse(new AsyncResponse() {
//通过自定义的接口回调获取AsyncTask中onPostExecute返回的结果变量
@Override
public void onDataReceivedSuccess(List<String> listData) {
Log.d(TAG, "onDataReceivedSuccess");
environmentList = listData;//如此,我们便把onPostExecute中的变量赋给了成员变量environmentList
}
@Override
public void onDataReceivedFailed() {
ToastUtil.show(MainActivity.this, "data received failed!");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}


