学而实习之 不亦乐乎

Android 线程切换实现异步操作

2023-08-18 07:44:14

一、判定当前线程是否是主线程

在 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);
    }
});