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是线程调度的,要合理释放和持有对象,避免内存泄漏
网友评论