Android系统线程间通信的3种方式

Android应用程序开发过程中需要在子线程中刷新UI,但是刷新UI的工作只能在主线程中完成,如果强制在子线程刷新UI会导致崩溃,此时Handler机制很好地解决了这个问题
Android系统有3种线程间通信的通信方式,分别为Handler、AsyncTask、runOnUiThread,其中AsyncTask、runOnUiThread从子线程切换到主线程刷新UI的原理是Handler机制

1. Handler

1.1 用法总结:

首先定义一个继承自Handler的MyHandler并复写handleMessage方法,主线程实例化MyHandler,子线程调用Handler.sendMessage发送消息,回调主线程的Handler.handleMessage

1.2 原理总结:

一个线程对应一个Looper,一个Looper对应一个MessageQueue,一个MessageQueue有多个Message,每个Message最多指定一个Handler处理消息
线程1执行Handler.sendMessage()方法,会将线程2创建的Handler保存到Message.target中,并将Message放入MessageQueue
//Looper.prepare()方法,会new Looper()并将new MessageQueue()保存到Looper.mQueue中
Looper.loop()方法,不断从MessageQueue中取出Message,交给Message.target(即Handler)的handleMessage处理,从而回调线程2创建的Handler复写的handleMessage方法
//若MessageQueue为空则会使用epoll机制休眠,直到下一个Message放入MessageQueue执行nativeWake()被唤醒

2. AsyncTask

2.1 用法总结:

首先定义一个继承自AsyncTask的MyAsyncTask并复写onPreExecute、doInBackground、onPostExecute方法
主线程实例化MyAsyncTask,并调用execute方法,会依次执行onPreExecute、doInBackground、onPostExecute方法
其中onPreExecute和onPostExecute在主线程中执行,doInBackground在子线程中执行,doInBackground在执行publishProgress时会回调到主线程执行onProgressUpdate刷新UI

2.2 原理总结:

执行MyAsyncTask.execute()时会在主线程执行onPreExecute,接着会使用SerialExecutor创建子线程,并在子线程中执行doInBackground,最终会执行postResult将doInBackground的
执行结果result保存到Message中,使用Handler机制发送一个Message切换到主线程,取出result,判断当前异步任务是否已经被取消,
如果已经被取消则会调用onCancelled()方法,如果没有被取消则会调用onPostExecute
当在执行doInBackground的过程中如果执行publishProgress时会使用Handler机制发送一个Message切换到主线程执行onProgressUpdate刷新UI

3. runOnUiThread

3.1 用法总结:

子线程执行runOnUiThread(),传入参数Runnable,并复写run方法

3.2 原理总结:

Handler会执行post将参数Runnable封装成一个Message并放入MessageQueue队列尾部,其中Message.callback = Runnable,Message.target = Handler
最终执行Handler.dispatchMessage判断Message.callback是否为空,如果为空则调用Handler.handleMessage,如果不为空则调用Handler.handleCallback
在handleCallback中调用Runnable复写的run方法,所以runOnUiThread的根本原理是Handler机制

Android系统线程间通信的3种方式分为以下三个部分讲解:
Android系统线程间通信方式之Handler机制
Android系统线程间通信方式之AsyncTask机制
Android系统线程间通信方式之runOnUiThread机制

你可能感兴趣的:(Android)