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