0%
我们为什么需要多线程机制?什么时候需要使用到多线程?
- 因为 Android 官方明确在多线程编程时有俩大原则:
- 使用情况
- 第一、将任务从主线程抛到工作线程;
- 第二、将任务从工作线程抛到主线程。
将任务从工作线程抛到主线程方式
Handler.sendXXXMessage()
等方法:Handler 是在主线程中定义的,所以handleMessage()
方法是在主线程中执行的。
Handler.post(Runnable r)
:这里事实上并没有开启一个新的线程,只是使 run()方法体的代码抛到了与mHandler
相关联的线程中执行了。
Activity.runOnUIThread(Runnable r)
:类似方面的post
方法,优点是不需要new
一个Handler
实例;
View.post(Runnable r)
: View
本身的处理方法;
AsyncTask
:在实现的doInBackground(Params...)
中执行耗时任务;
将任务从主线程抛到工作线程
new Thread/Runnable()
: 开启新线程方法;
HandlerThread
:
mAsyncTask.execute()
: HandlerThread
只开了一条线程,任务都被阻塞在一个队列中,那么就会使阻塞的任务延迟了,而AsyncTask
开启线程的方法mAsyncTask.execute()
默认也是开启一个线程和一个队列的,不过也可以通过使用mAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,0)
开启一个含有 5 个新线程的线程池,也就是说有 5 个队列了,假如你执行第六个耗时任务时,除非前面 5 个都还没有执行完成,否者任务不会被阻塞,这样就大大减少耗时任务延迟的可能性。这就是它的有点所在;
IntentService
: 该类继承Service
类,用法跟Service
类似。耗时任务放在onHandleIntent(Intent intent)
的方法体中执行,它同样有着退出启动它的Activity
后不会被系统杀死的特点,而且当任务执行完成之后会自动停止,无须手动终止它。eg. 后台下载文件;