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. 后台下载文件;