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(); } } }