科普一下 线程是操作系统调度的最小单元.
线程在android中是一个很重要的概念.
主线程 也叫 UI 线程 作用: 运行四大组件以及处理他们和用户交互.
子线程 作用; 执行耗时任务. 比如 I/O 操作, 网络请求.
android 3.0 开始,网络访问必须放在子线程中.
线程形态: 1传统的Thread, 2 AsyncTask ,3 HandlerThread ,4 IntentService
2,3,4 这个三者底层实现也是线程,各有各自的优缺点.
下面解析一下
AsyncTask
一种 轻量级的异步任务类,可以在线程池中执行后台任务 . 然后把执行的进度条和最终结果传递给主线程 并在主线程中更新UI.
注意:AsyncTask 不适合特别耗时的后台任务. 可以使用线程池来解决.
4个核心方法
此外还有一个方法
步骤 : onPreExecute 先执行, 接着是 doInBackground ,最后是 onPostExecute , 除了这个四个方法之外 , 当异步任务取消的时候会执行 onCancelled()方法. 这个时候 onPostExecute 不会调用了
AsyncTask 使用限制
1 ,AsyncTask的类必须在主线程中加载. (5.0源码中可见)
2.execute 方法必须在UI线程调用.
3.一个AsyncTask 对象只能执行一次. 否则报运行时异常错误
4.AsyncTask的对象必须在主线程中创建.
源码解析
在多说一点 :
AsyncTask中有两个线程池,(SerialExecutor 和 THREAD_POOL_EXECUTOR ) 和 一个Handler(InternalHandler ) ,
其中,
线程池SerialExecutor 用于任务的排队,
THREAD_POOL_EXECUTOR 用于真正的执行任务,
InternalHandler 用于将执行环境从线程池中切换到主线程.
好的今天 就分享这么多啦. 下次有时间 和大家分享一下 线程池的 故事..