6.初探Asynctask

AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
有必要的话你还得重写以下这三个方法,但不是必须的:

onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:

Task的实例必须在UI thread中创建;
execute方法必须在UI thread中调用;
不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
该task只能被执行一次,否则多次调用时将会出现异常;

下面我写的一个AsyncTask简单例子:

 1 public class MainActivity extends Activity implements View.OnClickListener {
 2 
 3     private static final String TAG = MainActivity.class.getSimpleName();
 4     private Button mButton = null;
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9         initView();
10     }
11 
12     public void initView(){
13         mButton = (Button)findViewById(R.id.button);
14         mButton.setOnClickListener(this);
15     }
16 
17     @Override
18     public void onClick(View view) {
19         if (view == mButton){
20             // 保证AsyncTask在Android 3.0以上版本并行
21             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
22                 Log.v(TAG,"BUILD11111");
23                 new NewAsyncTask("AsyncTask#1111").
24                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
25                 new NewAsyncTask("AsyncTask#2222").
26                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
27                 new NewAsyncTask("AsyncTask#3333").
28                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
29                 new NewAsyncTask("AsyncTask#4444").
30                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
31                 new NewAsyncTask("AsyncTask#5555").
32                         executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"");
33                 Log.v(TAG,"BUILD22222");
34             }
35         }
36 
37     }
38 
39     private static class NewAsyncTask extends AsyncTask<String, Integer, String>{
40         private String mName = "AsyncTask";
41         public NewAsyncTask(String name){
42             super();
43             mName = name;
44         }
45         @Override
46         protected String doInBackground(String... strings) {
47             try{
48                 Log.v(TAG,"doInBackground====");
49                 Thread.sleep(3000);
50             }catch (InterruptedException e){
51                 e.printStackTrace();
52             }
53             return mName;
54         }
55 
56         @Override
57         protected void onPostExecute(String result){
58             super.onPostExecute(result);
59             SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
60             Log.v(TAG, result + "execute finish at" + df.format(new Date()));
61         }
62     }
63 }

运行效果:

最后总结一下:

Asynctask默认支持可并发任务数量是5个,使用AsyncTask,你要做的是继承父类,然后重写doInBackground(Params...),在里面实现后台操作,如果有返回结果的话,重写onPostExecute(Result),然后处理后台程序的结果。
如果需要更新进度的话,在onPreExecute()里实例化进度条(也可以不在这),之后在doInBackground(Params...)里面用publishProgress()发布进度值,然后重写onProgressUpdate(Progress...)接收onPreExecute()发布的结果,并添加更新进度条的代码。

原文地址:https://www.cnblogs.com/benchao/p/6114019.html