Welcome to Ray's Blog

Stay Hungry Stay Foolish - Steve Jobs

0%

Android 多线程问题笔记


我们为什么需要多线程机制?什么时候需要使用到多线程?

  1. 因为 Android 官方明确在多线程编程时有俩大原则:
    • 第一、不能阻塞 UI 线程(主线程);
  • 第二、不能在 UI 线程之外访问 UI 组件;
  1. 使用情况
    • 第一、将任务从主线程抛到工作线程;
    • 第二、将任务从工作线程抛到主线程。

将任务从工作线程抛到主线程方式

  1. Handler.sendXXXMessage()等方法:Handler 是在主线程中定义的,所以handleMessage()方法是在主线程中执行的。
  2. Handler.post(Runnable r):这里事实上并没有开启一个新的线程,只是使 run()方法体的代码抛到了与mHandler相关联的线程中执行了。
  3. Activity.runOnUIThread(Runnable r):类似方面的post方法,优点是不需要new一个Handler实例;
  4. View.post(Runnable r) : View本身的处理方法;
  5. AsyncTask:在实现的doInBackground(Params...)中执行耗时任务;

将任务从主线程抛到工作线程

  1. new Thread/Runnable(): 开启新线程方法;
  2. HandlerThread :
  3. mAsyncTask.execute() : HandlerThread只开了一条线程,任务都被阻塞在一个队列中,那么就会使阻塞的任务延迟了,而AsyncTask开启线程的方法mAsyncTask.execute()默认也是开启一个线程和一个队列的,不过也可以通过使用mAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,0)开启一个含有 5 个新线程的线程池,也就是说有 5 个队列了,假如你执行第六个耗时任务时,除非前面 5 个都还没有执行完成,否者任务不会被阻塞,这样就大大减少耗时任务延迟的可能性。这就是它的有点所在;
  4. IntentService: 该类继承Service类,用法跟Service类似。耗时任务放在onHandleIntent(Intent intent)的方法体中执行,它同样有着退出启动它的Activity后不会被系统杀死的特点,而且当任务执行完成之后会自动停止,无须手动终止它。eg. 后台下载文件;