AsyncTask作为android提供的轻量级异步类,实现异步操作。同Thread+Handler组合实现异步来讲,它的实现方式显得更加简洁一些。
完整的大纲视图:
通过cancel(),getStatus()等方法,发现我们对线程是可控的。
使用:
我们直接继承AsyncTask 就可以了。
class TestAsyncTask extends AsyncTask<Params, Progress, Result>
params:excute()中输入的枚举参数类型,会在doInBackground()中作为输入参数数组类型。
Progress:doInBackground()中返回给onProgressUpdate()的输入类型。
Result:doInbackground()的返回类型,也是onpostExcute()的输入类型。
方法,执行顺序从上至下依次进行:
首先我们会在ui线程中,创建该任务,然后excute()方法启动任务。
excute(Params...params):传递枚举数据给doInBackground(params)作为输入参数。
onPreExcute():在excute()执行后执行,一般作为在子线程运行前的对ui的标记。
doInBackground(Params...params):在onPreExcute()执行后执行,在子线程中执行,用于网络操作等比较费时的操作,不能操作ui线程组件。
onProgressUpdate(Progress...values):在doInBackground()中执行publishProgress(),将消息更新到ui中。
onPostExcute(Result result):当doInBackground()执行完后执行,接受其返回的数据。
实例:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TestAsyncTask task = new TestAsyncTask(); // doInBackground :传递枚举数据 task.execute("p1", "p2", "p3"); } private class TestAsyncTask extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Log.d("onPreExecute", "in onPreExecute"); } /** * params :数组。来自excute 传递的枚举数据. */ @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub // 遍历传递的数据 for (int i = 0; i < params.length; i++) { Log.d("doInBackground", params[i]); } // 向 onPostExecute()传递参数 publishProgress("in publish"); // 向onPostExecute()传递参数 return "in result"; } @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub Log.d("onProgressUpdate", values[0]); } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub Log.d("onPostExecute", result); } } }
注意:
1.异步任务的实例必须在ui线程中创建和执行。
2.不能手动的调用内部的这几个方法。doInBackground()方法中不能对ui组件进行操作。
3.一个任务实例只能执行一次。