美文网首页
androidApi: AsyncTask

androidApi: AsyncTask

作者: 壹零二肆 | 来源:发表于2020-04-17 18:00 被阅读0次

https://mp.weixin.qq.com/s/Dt4zKqfLc6jrl22HaXy3Fw

多线程方式

基石:Handler

Handler是一种线程发消息的机制,Looper被线程持有,保存在ThreadLocal中,一个线程一个Looper(需要时候创建),在A线程创建Handler,Handler就会使用A线程拥有的Looper(创建MessageQueue和从MessageQueue中loop循环取消息)。
总结创建handler需要Looper,什么线程创建Handler就会拿什么线程的Looper,也可以直接指定Looper。一个线程的Looper可以用来创建多个Handler,可以被共用,但是MessageQueue中取消息总是可以根据消息的target送到指定的Handler中来处理。很多场景会共用Looper,比如这里的AsyncTask就共用了main UI线程的Looper,使得onPostExecute和onProgressUpdate可以运行在主线程。

AsyncTask

ThreadPoolExecutor

IntentService

RxJava Kotlin协程


AsyncTask

弃用

使用方法

文档

继承该抽象类


public class CountTask extends AsyncTask<String,Integer,String> {
    private Context context;

    public CountTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(String... strings) {
        Log.i("gong",Thread.currentThread().getName());
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
                publishProgress(i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String s) {
        Toast.makeText(context,"后台计数结束!",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        Log.i("gong","进度:"+values[0]);
    }
}

Activity中使用

  //并行执行AsyncTask  其内部有两个线程池  一个是串行执行线程池,一个是并行执行线程池  
        new CountTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "hello");
        new CountTask(MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "hello");  

优点

  • 在后台执行操作后可以很轻松操作更新UI.

缺点

  • 内存泄漏(doInBackground方法结束控制)
  • Activity销毁后更新UI失效
  • 崩溃,AsyncTask中的线程池是静态创建共享的单例,所有的子类都共用。
分享 积累

相关文章

网友评论

      本文标题:androidApi: AsyncTask

      本文链接:https://www.haomeiwen.com/subject/tnmyvhtx.html