React Native 之Android端 Bolts库

React Native 之Android端Bolts库

前言

这是我们React Native框架源码剖析的第一篇文章。为什么要写Android端Bolts库介绍?因为在分析安卓端源码时,有大量的使用到了Bolts库,如果不对该库做简单介绍,会严重影响源码阅读。工欲善其事必先利其器,对该库有一个基本了解,对于安卓端RN源码的分析是必要的。

有一点要注意,Bolts库仅在安卓端使用,iOS并未使用该库。这是因为在新架构中,iOS更倾向于使用Swift的现代异步特性。即使是老的代码中,iOS端也可以使用像NSOperation、dispatch_async等这样的原生API。Android端是由于Java的异步编程复杂性,才选择了Bolts框架。

背景

在2013年,Parse 被Facebook 收购。并于2014年开源了一个面向iOS 和Android 的底层库集合,统称为Bolts。根据Parse 的公告,Bolts 是Parse 和Facebook 共同努力将两家公司各自独立开发的小型底层工具类合并的结果。

Tasks

Tasks 是GitHub 上第一个可用的Bolts 组件,旨在按照JavaScript Promises 模型处理异步操作,它同时适用于 iOS 和 Android 系统。简单说,它类似于Dart的Future和JavaScript的Promise。

Bolts-Android

Bolts-Android 是安卓平台的Java实现,于2020年停止维护。仓库地址

该库提供了这些功能:

  • 任务抛到某个线程执行:当前线程、后台线程、UI线程执行任务
  • 任务级联执行:UI线程、后台线程、UI线程执行任务
  • 任务并行执行:Task.whenAll多任务并行执行
  • 自定义任务线程池
  • 延时执行任务
  • 取消执行的任务

API 的使用

任务抛到某个线程执行

当前线程、后台线程、UI线程运行任务

Java 示例:

java 复制代码
// 运行在当前线程中
public Task<Boolean> runOnCurrentThread() {
   return Task.call(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
           // Current_Thread
           return true;
       }
   });
}

// 运行在后台线程
public Task<Boolean> runOnBackgroundThread() {
   return Task.call(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
           // Background_Thread
           return true;
       }
   }, Task.BACKGROUND_EXECUTOR);
}

// 运行在UI线程中
public Task<Boolean> runOnUIThread() {
   return Task.call(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
           // UI_Thread
           return true;
       }
   }, Task.UI_THREAD_EXECUTOR);
}

Kotlin 示例:

kotlin 复制代码
// 运行在当前线程中
fun runOnCurrentThread(): Task<Boolean> {
    return Task.call(Callable {
        // Current_Thread
        true
    })
}

// 运行在后台线程
fun runOnBackgroundThread(): Task<Boolean> {
    return Task.call(Callable {
        // Background_Thread
        true
    }, Task.BACKGROUND_EXECUTOR)
}

// 运行在UI线程中
fun runOnUIThread(): Task<Boolean> {
    return Task.call(Callable {
        // UI_Thread
        true
    }, Task.UI_THREAD_EXECUTOR)
}

Kotlin 示例(使用标签语法,更简洁):

kotlin 复制代码
// 运行在当前线程中
fun runOnCurrentThread() = Task.call(Callable task@{
    // Current_Thread
    true
})

// 运行在后台线程
fun runOnBackgroundThread() = Task.call(Callable task@{
    // Background_Thread
    true
}, Task.BACKGROUND_EXECUTOR)

// 运行在UI线程中
fun runOnUIThread() = Task.call(Callable task@{
    // UI_Thread
    true
}, Task.UI_THREAD_EXECUTOR)
任务级联执行

Java 示例:

java 复制代码
// 任务顺序执行
public Task synchronousTask(CancellationToken cancellationToken) {
   return Task.call(new Callable<Void>() {
       @Override
       public Void call() throws Exception {
           // UI_Thread
           LogUtils.d(TAG, "---1 UI_Thread---");
           return null;
       }
   }, Task.UI_THREAD_EXECUTOR, cancellationToken).onSuccess(new Continuation<Void, Boolean>() {
       @Override
       public Boolean then(Task<Void> task) throws Exception {
           // Background_Thread
           LogUtils.d(TAG, "---2 Background_Thread---");
           return true;
       }
   }, Task.BACKGROUND_EXECUTOR).continueWith(new Continuation<Boolean, Void>() {
       @Override
       public Void then(Task<Boolean> task) throws Exception {
           // UI_Thread
           LogUtils.d(TAG, "---3 UI_Thread---");
           return null;
       }
   }, Task.UI_THREAD_EXECUTOR);
}

Kotlin 示例:

kotlin 复制代码
// 任务顺序执行
fun synchronousTask(cancellationToken: CancellationToken): Task<Void?> {
    return Task.call(Callable {
        // UI_Thread
        LogUtils.d(TAG, "---1 UI_Thread---")
        null
    }, Task.UI_THREAD_EXECUTOR, cancellationToken).onSuccess(Continuation { task ->
        // Background_Thread
        LogUtils.d(TAG, "---2 Background_Thread---")
        true
    }, Task.BACKGROUND_EXECUTOR).continueWith(Continuation { task ->
        // UI_Thread
        LogUtils.d(TAG, "---3 UI_Thread---")
        null
    }, Task.UI_THREAD_EXECUTOR)
}
任务并行执行

Java 示例:

java 复制代码
// 多任务并行
public void whenAll() {
   ArrayList<Task<Void>> tasks = new ArrayList<Task<Void>>();
   for (int i = 0; i < 3; i++) {
       final int index = i;
       // Start this delete immediately and add its task to the list.
       tasks.add(Task.call(new Callable<Void>() {
           @Override
           public Void call() throws Exception {
               // UI_Thread
               LogUtils.d(TAG, "---###########################---");
               LogUtils.d(TAG, "index: " + index);
               return null;
           }
       }, Task.BACKGROUND_EXECUTOR));
   }

   Task.whenAll(tasks);
}

Kotlin 示例:

kotlin 复制代码
// 多任务并行
fun whenAll() {
    val tasks = ArrayList<Task<Void?>>()
    for (i in 0 until 3) {
        // Start this delete immediately and add its task to the list.
        tasks.add(Task.call(Callable {
            // UI_Thread
            LogUtils.d(TAG, "---###########################---")
            LogUtils.d(TAG, "index: $i")
            null
        }, Task.BACKGROUND_EXECUTOR))
    }
    
    Task.whenAll(tasks)
}
自定义任务线程池

Java 示例:

java 复制代码
// 自定义线程池
static final Executor NETWORK_EXECUTOR = Executors.newCachedThreadPool();
static final Executor DISK_EXECUTOR = Executors.newCachedThreadPool();

public void changeThreadPool() {
   Task.call(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
           // NETWORK_Thread
           return null;
       }
   }, NETWORK_EXECUTOR).continueWith(new Continuation<Boolean, String>() {
       @Override
       public String then(Task<Boolean> task) throws Exception {
           // NETWORK_Thread
           return null;
       }
   }).continueWith(new Continuation<String, Integer>() {
       @Override
       public Integer then(Task<String> task) throws Exception {
           // DISK_Thread
           return null;
       }
   }, DISK_EXECUTOR);
}

Kotlin 示例

kotlin 复制代码
// 自定义线程池
companion object {
    val NETWORK_EXECUTOR: Executor = Executors.newCachedThreadPool()
    val DISK_EXECUTOR: Executor = Executors.newCachedThreadPool()
}

fun changeThreadPool() {
    Task.call(Callable {
        // NETWORK_Thread
        null
    }, NETWORK_EXECUTOR).continueWith(Continuation { task ->
        // NETWORK_Thread
        null
    }).continueWith(Continuation { task ->
        // DISK_Thread
        null
    }, DISK_EXECUTOR)
}
延时执行任务

Java 示例:

java 复制代码
Task.delay(100).continueWith(new Continuation<Void, Void>() {
    @Override
    public Void then(Task<Void> task) throws Exception {
        mTcpSocketAgent.initClientSocket(serverIp);
        mTcpSocketAgent.addMsgCallback(mTcpMsgCallback);
        mTcpSocketAgent.startConnect();
        return null;
    }
}, Task.UI_THREAD_EXECUTOR);

Kotlin 示例:

kotlin 复制代码
Task.delay(100).continueWith(Continuation { task ->
    mTcpSocketAgent.initClientSocket(serverIp)
    mTcpSocketAgent.addMsgCallback(mTcpMsgCallback)
    mTcpSocketAgent.startConnect()
    null
}, Task.UI_THREAD_EXECUTOR)
取消执行的任务

Java 示例:

java 复制代码
// 取消任务
public void cancelTask() {
   CancellationTokenSource cts = new CancellationTokenSource();
   Task<Boolean> stringTask = runOnBackgroundThread(cts.getToken());
   cts.cancel();
}

// 运行在后台线程中
public Task<Boolean> runOnBackgroundThread(CancellationToken cancellationToken) {
   return Task.call(new Callable<Boolean>() {
       @Override
       public Boolean call() throws Exception {
           // Background_Thread
           return true;
       }
   }, Task.BACKGROUND_EXECUTOR, cancellationToken);
}

Kotlin 示例:

kotlin 复制代码
// 取消任务
fun cancelTask() {
    val cts = CancellationTokenSource()
    val stringTask = runOnBackgroundThread(cts.token)
    cts.cancel()
}

// 运行在后台线程中
fun runOnBackgroundThread(cancellationToken: CancellationToken): Task<Boolean> {
    return Task.call(Callable {
        // Background_Thread
        true
    }, Task.BACKGROUND_EXECUTOR, cancellationToken)
}
相关推荐
小酒星小杜2 小时前
在AI时代,技术人应该每天都要花两小时来构建一个自身的构建系统 - Build 篇
前端·vue.js·架构
lili-felicity2 小时前
React Native 鸿蒙跨平台开发:Animated 实现鸿蒙端组件的旋转 + 缩放组合动画
react native·react.js·harmonyos
爬山算法2 小时前
Hibernate(38)如何在Hibernate中配置乐观锁?
android·java·hibernate
奔跑的web.2 小时前
TypeScript 全面详解:对象类型的语法规则
开发语言·前端·javascript·typescript·vue
江上月5132 小时前
JMeter中级指南:从数据提取到断言校验全流程掌握
java·前端·数据库
代码猎人2 小时前
forEach和map方法有哪些区别
前端
恋猫de小郭2 小时前
Google DeepMind :RAG 已死,无限上下文是伪命题?RLM 如何用“代码思维”终结 AI 的记忆焦虑
前端·flutter·ai编程
m0_471199632 小时前
【小程序】订单数据缓存 以及针对海量库存数据的 懒加载+数据分片 的具体实现方式
前端·vue.js·小程序
编程大师哥2 小时前
Java web
java·开发语言·前端