(进度条)AsyncTask中核心方法讲解之易被忽略的onProgressUpdate

来源:互联网 发布:unity3d 刚体穿透 编辑:程序博客网 时间:2024/06/06 03:27

     AsyncTask是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。

     它是一个抽象的泛型类,它提供了Params、Progress、和Result着三个泛型参数,本篇主要讲解第二个参数的应用,进度条的实现。

     说一下进度条实现相关两个方法:

      doInBackground(Params...params)。这是在线程池中执行的方法,该方法执行异步任务,发生在子线程中。params参数表示异步任务输入参数。这里面可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。

     onProgressUpdate(Progress...values),这个方法是在主线程中执行的。就是当后台任务的执行进度发生改变的时候会被调用。

简单的进度条实现代码如下:

   public class Progressestest extends Activity {
    private ProgressBar mProgressBar;
    private MyAsytask myAsytask;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_progressest);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
        myAsytask = new MyAsytask();
        myAsytask.execute();
    }

    protected void onPause() {
        super.onPause();
        // 如果异步的不为空或者正在执行,把他取消掉
        if (myAsytask != null
                && myAsytask.getStatus() == AsyncTask.Status.RUNNING) {
            // cancel方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。
            // cancel状态,结束进程
            myAsytask.cancel(true);
        } else {
        }
    }

    class MyAsytask extends AsyncTask<Void, Integer, Void> {
        protected Void doInBackground(Void... arg0) {
            // 模拟进度条的更新
            for (int i = 0; i < 100; i++) {
                if (isCancelled()) {
                    break;
                }
                publishProgress(i);
                try {
                    // 一天86400
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            if (isCancelled()) {
                return;
            }
            // 获取进度更新值
            mProgressBar.setProgress(values[0]);
        }
    }
}

在代码中可能有几个小疑问,不知大家是否注意到doInBackground和onProgressUpadate方法它们的参数中包含...的字样,在java中...表示参数的数量不定,是一种数组型参数,它与c语言中的...是一致的。还有在起初提到的什么是泛型呢?

List<String> list = new ArrayList<String>();
list.add("gang");
list.add("oo"); //list.add(100);   // 1  提示编译错误

这样一段简单的代码是不能想起来泛型的一些概念。


2 0
原创粉丝点击