AsyncTask 学习 (2)

java.lang.Object  

  ↳android.os.AsyncTask<Params, Progress, Result>

概要

AsyncTask可以方便适当地使用UI线程。他允许执行后台操作并且可以直接在UI线程上发布结果,而不需要操作线程或handler。

一个异步任务(asynchronous task)由一个后台运行的计算(computation)来定义,他的结果将在UI线程上发布。

一个异步任务(asynchronous task)由3个泛化类型(Params,Progress,Result)和4个步骤(begin, doInBackground, processProgress, end)来定义说明。

用法
AsyncTask必须继承使用。子类至少必须重写一个方法(doInBackground(Params...))。通常,还会重写另一个方法(onPostExecute(Result))。
一个子类的例子:
view plaincopy to clipboardprint?

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {  

    protected Long doInBackground(URL... urls) {  

        int count = urls.length;  

        long totalSize = 0;  

        for (int i = 0; i < count; i++) {  

            totalSize += Downloader.downloadFile(urls[i]);  

           publishProgress((int) ((i / (float) count) * 100));  

       }  

       return totalSize;  

   }  

   protected void onProgressUpdate(Integer... progress) {  

        setProgressPercent(progress[0]);  

   }  

   protected void onPostExecute(Long result) {  

        showDialog("Downloaded " + result + " bytes");  

    }  

 


 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

     protected Long doInBackground(URL... urls) {

         int count = urls.length;

         long totalSize = 0;

         for (int i = 0; i < count; i++) {

             totalSize += Downloader.downloadFile(urls[i]);

             publishProgress((int) ((i / (float) count) * 100));

         }

         return totalSize;

     }

     protected void onProgressUpdate(Integer... progress) {

         setProgressPercent(progress[0]);

     }

     protected void onPostExecute(Long result) {

         showDialog("Downloaded " + result + " bytes");

     }

 }

创建之后,任务的执行非常简单:
view plaincopy to clipboardprint?
01.new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTask的3个泛化类型
异步任务使用如下3种类型:

1. Params,传递给任务的参数类型。

2. Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)

3. Result, 后台执行返回的结果的类型。

AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。

view plaincopy to clipboardprint?
01.private class MyTask extends AsyncTask<Void, Void, Void> { ... } 
private class MyTask extends AsyncTask<Void, Void, Void> { ... }

 

AsyncTask的4个步骤

一个异步任务需要执行下面4个步骤

1. onPreExecute(), 该步骤在任务被执行之后立即由UI线程调用。

    这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。

2. doInBackground(Params...), 该步骤由后台线程在onPreExecute()方法执行结束后立即调用。该步骤通常被用来执行耗时的后台计算。计算的结果必须由该步骤返回,并被传递到最后一个步骤中。该步骤也可以使用publishProgress(Progress...)来发布一个或多个进度单位(units of progress)。这些值将会在onProgressUpdate(Progress...)步骤中被发布到UI线程。

3. onProgressUpdate(Progress...), 该步骤由UI线程在publishProgress(Progress...)方法调用完后被调用。

    并未定义该方法执行的时机。该方法在后台进程计算仍在执行的时候,在UI上显示任何形式的进度。一般用于动态地显示一个进度条或者在文本框中显示log。

4. onPostExecute(Result), 由UI进程在后台计算结束后调用。后台计算的结果会被作为参数传递给这一步骤。

 

线程规则

为了能使该类正常执行,需要遵循下列规则:

- Task的实例必须在UI线程中被调用。

- execute(Params...)必须在UI线程中调用。

- 不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)。

- Task只能被执行一次,如果想第二次执行会抛出异常。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pwair/archive/2010/11/23/6030364.aspx

 

有一些线程规则必须去遵守,这个类才会正确的工作:

*任务实例必须创建在 UI线程

* execute(Params...)必须在 UI线程上调用

*不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)

*任务会执行仅一次(假如有第二个尝试去执行,将抛出一个异常)

 

01public class Double extends Activity {
02  
03    public ProgressBar pBar;
04  
05    /** Called when the activity is first created. */
06    @Override
07    protected void onCreate(Bundle savedInstanceState) {
08        super.onCreate(savedInstanceState);
09        setContentView(R.layout.main);
10        pBar = (ProgressBar) findViewById(R.id.progress_bar);
11        //线程规则二:execute(Params...)必须在UI线程上调用
12        new AsyncLoader().execute((Void)null);
13    }
14  
15    public void initProgress() {
16        pBar.setProgress(0);
17        //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
18        for (int i = 0; i < 100; i++) {
19            System.out.println("***********" + i + "*************");
20        }
21        pBar.setProgress(30);
22        //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
23        for (int i = 0; i < 100; i++) {
24            System.out.println("***********" + i + "*************");
25        }
26        pBar.setProgress(60);
27        //这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
28        for (int i = 0; i < 100; i++) {
29            System.out.println("***********" + i + "*************");
30        }
31        pBar.setProgress(100);
32        Intent intent = new Intent(Double.this, Double2.class);
33        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
34        startActivity(intent);
35        finish();
36    }
37      
38    //继承于AsyncTask
39    class AsyncLoader extends AsyncTask<Void, Void, Integer>{
40  
41        @Override
42        protected Integer doInBackground(Void... params) {
43            initProgress();
44            return null;
45        }
46          
47    }
48}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值