Android AsyncTask

AsyncTask类任务管理:

  内部会创建一个进程作用域的线程池来管理要运行的任务,也就就是说当你调用了AsyncTask#execute()后,AsyncTask会把任务交给线程池,由线程池来管理创建Thread和运行Therad。

3.0以后的AsyncTask类加载方法:

//按先后顺序每次只运行一个
private static ExecutorService SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor(); 

//自定义的CorePoolSize为7的线程池,允许7个线程同时运行
private static ExecutorService  LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(7);  

//未设限制,全部执行
private static ExecutorService  FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool();  

//提供自定义的线程池来运行和调度Thread
task.executeOnExecutor(SINGLE_TASK_EXECUTOR);
//task.executeOnExecutor(LIMITED_TASK_EXECUTOR);
//task.executeOnExecutor(FULL_TASK_EXECUTOR);

使用AsyncTask类,以下是几条必须遵守的准则:

1) Task的实例必须在UI thread中创建;

2) execute方法必须在UI thread中调用;

3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;

4) 不能在doInBackground(Params... params)中更改UI组件的信息。

5) 该task只能被执行一次,否则多次调用时将会出现异常;

1 private CustomTask mTask;
2 @Override  
3 public void onClick(View v) {  
4       //注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常  
5       mTask = new Custom();  
6       mTask.execute("http://www.baidu.com");
7 }

自定义AsyncTask:

三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。

 1 private class CustomTask extends AsyncTask<String, Integer, String> {  
 2         //onPreExecute方法用于在执行后台任务前做一些UI操作  
 3         @Override  
 4         protected void onPreExecute() {  
 5             textView.setText("loading...");  
 6         } 
 7           
 8         //doInBackground方法内部执行后台任务,不可在此方法内修改UI  
 9         @Override  
10         protected String doInBackground(String... params) {    
11             try { 
12                     for (int count = 0; count < 10; count ++) { 
13                         //调用publishProgress方法公布进度,触发onProgressUpdate方法,从而对UI进行修改 
14                         publishProgress((int) ((count / (float) total) * 100));  
15                         //休眠500毫秒  
16                         Thread.sleep(500);  
17                     }
18                     return new String("success"); 
19             } catch (Exception e) {  
20                 Log.e(TAG, e.getMessage());  
21             }  
22             return null;  
23         }  
24           
25         //onProgressUpdate方法用于更新进度信息  
26         @Override  
27         protected void onProgressUpdate(Integer... progresses) {  
28             progressBar.setProgress(progresses[0]);  
29             textView.setText("loading..." + progresses[0] + "%");  
30         } 
31           
32         //onPostExecute方法用于在执行完后台任务后更新UI,显示结果  
33         @Override  
34         protected void onPostExecute(String result) {  
35             textView.setText(result); 
36         }  
37           
38         //onCancelled方法用于在取消执行中的任务时更改UI  
39         @Override  
40         protected void onCancelled() {  
41             textView.setText("cancelled");
42             progressBar.setProgress(0); 
43         }  
44     }  

当需要停止任务时:

@Override  
public void onClick(View v) {  
     //取消一个正在执行的任务,onCancelled方法将会被调用  
     mTask.cancel(true);  
}
原文地址:https://www.cnblogs.com/CharlesGrant/p/4867296.html