AsyncTask

2021-04-28  本文已影响0人  森屿暖茶

AsyncTask

一个Android 已封装好的轻量级异步类,属于抽象类,即使用时需 实现子类

意义

在工作线程中多线程异步执行任务,如 耗时任务,并将工作线程的执行结果传递给主线程,从而在主线程中执行相关的UI操作。

方法

使用(推荐实例对象使用,静态内部类使用容易持有Activity,如果处理不好容易造成内存泄漏)

1.创建AsyncTask的实现类。

2.实例化子类,并调用执行

相当于执行开启一个线程执行Run(一般不这么使用)

AsyncTask运行机制

内部实现一个InternalHandler,在工作线程执行结果,在主线程更新UI。

AsyncTask的串行并行问题

串行

在默认情况下调用execute()方法,AsyncTask是串行的,为什么呢?直接看源码。

看到这里我们明白了,由于队列是先进先出的,所以任务会根据任务的提交顺序,进行顺序执行。

并行

在调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)时,AsyncTask是并行的,为什么呢?直接看源码。

SynchronousQueue队列(不存储元素的队列),在这里作用:只要可以提交到线程运行任务就提交到线程执行任务

看到这里我们明白了,由于线程池的默认设置(线程池相关内容不详细解释了,不明白可以看线程相关内容),提交的任务会在线程池中执行。当然我们可以自定义线程池传入给executeOnExecutor方法,那样AsyncTask的任务就会按照我们配置的线程池特性执行任务了。

PS:通过源码分析我们知道,由于SERIAL_EXECUTOR和THREAD_POOL_EXECUTOR被声明为static,所以,同一个进程里的AsyncTask都会共享这个线程池(原因请查看JVM)。所以你不管new 多少AsyncTask实例,他都是在你设置的池子里运行。所以你完全不用担心new AsyncTask实例会产生多个线程池帮你执行任务,除非你自定义线程池。

总结

注意AsyncTask的串行并行使用,注意AsyncTask是线程调度的,要合理释放和持有对象,避免内存泄漏

上一篇下一篇

猜你喜欢

热点阅读