AsyncTask详解

2017-11-15  本文已影响48人  Skypew

一.什么是AsyncTask

它本质上是封装了线程池和handler的异步框架,主要执行异步任务

二.AsyncTask的用法

public class UpdateInfoAsyncTask  extends AsyncTask<Integer,Integer,String>{


  private TextView textView;
  private ProgressBar progressBar;


    public UpdateInfoAsyncTask(TextView textView, ProgressBar progressBar) {
        this.textView = textView;
        this.progressBar = progressBar;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        textView.setText("UI线程,开始执行 ");

    }

    @Override
    protected String doInBackground(Integer... params) {
        int i;
        for (i=10;i<=100;i+=10){
            //发送当前 进度
            publishProgress(i);
        }
        return i+params[0].intValue()+"";
    }


    /**
     * 当前进度
     * @param values
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        int vlaue =values[0];
        progressBar.setProgress(vlaue);

    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);

        textView.setText("异步操作执行结果返回"+s);

    }
}

三.AsyncTask的机制原理

image.png

四.AsyncTask的的注意事项

1.内存泄漏

解决方法和hander类似 可以把AsyncTask设置为静态的 ,弱引用
onDestroy中调用 cancel(boolean)方法取消任务

2.生命周期

不会随着activity 的销毁而销毁,需要调用cancel方法 ,保证程序稳定
没有取消可能会崩溃 因为ui线程依托的activity已销毁了

3.结果丢失

由于屏幕旋转和 内存不够结果被杀掉 ,activity重新启动
AsyncTask会持有之前activity的引用,引用无效,会导致 publishProgress 更新无效

4.串行or并行

做不了太高并发,太耗时的操作

1.6版本以前 是串行
1.6到2.3是并行
2.3以后 默认串行 可以调用 executeOnExecutor(Executor)来执行并行(不建议并行)0
最简单的方法法就是使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Params... params)

上一篇 下一篇

猜你喜欢

热点阅读