Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )相关的知识,希望对你有一定的参考价值。
一、判定当前线程是否是主线程
在 android 中 , 如果要判定当前线程是否是主线程 , 可以使用如下方法进行判定 ;
调用 Looper
的 getMainLooper()
静态方法获取 mainLooper , 调用 Looper
的 myLooper()
静态方法获取 myLooper , 对比二者是否相等 ;
Looper.getMainLooper()
方法获取的总是本进程的主线程 Looper
对象 ;
Looper.myLooper()
方法获取的是当前 Looper 线程的 Looper
对象 ,
如果当前线程是主线程 , 那么这两个 Looper
对象是相同的 ;
// 判断当前线程是否是主线程
// 获取 mainLooper 与 myLooper 进行比较 , 如果一致 , 说明该线程是主线程
boolean isMainThread = false;
// 下面的情况下 , 线程是主线程
if (Looper.getMainLooper() == Looper.myLooper()) {
isMainThread = true;
}
二、子线程中执行主线程方法
获取主线程的 Looper
, 通过 Looper
创建对应的 Handler
, 然后通过该 Handler
向其发送 Runnable 任务即可 ;
一个线程只能有一个 Looper
和 MessageQueue
, 但是可以有多个 Handler
;
其中 MessageQueue
封装在 Handler
中 ;
// 将订阅方法放到主线程执行
// 获取主线程 Looper , 并通过 Looper 创建 Handler
Handler handler = new Handler(Looper.getMainLooper());
// 在主线程中执行订阅方法
handler.post(new Runnable() {
@Override
public void run() {
invokeMethod(subscription, event);
}
});
三、主线程中执行子线程方法
可以直接创建 Thread
线程并执行 ;
也可以创建 ExecutorService
线程池 , 执行线程任务 ;
/**
* 线程池
*/
private final ExecutorService executorService = Executors.newCachedThreadPool();
// 在线程池中执行方法
executorService.execute(new Runnable() {
@Override
public void run() {
invokeMethod(subscription, event);
}
});
以上是关于Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )的主要内容,如果未能解决你的问题,请参考以下文章
android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
安卓Android开发:使用Executor线程池代替AsyncTask进行异步操作
安卓Android开发:使用Executor线程池代替AsyncTask进行异步操作