博客
关于我
facebook开源库-Bolts中文文档
阅读量:262 次
发布时间:2019-03-01

本文共 5895 字,大约阅读时间需要 19 分钟。

Bolts - 一个轻量级的移动应用开发库集合

Bolts 是一个由 Parse 和 Facebook 设计并内部使用的低级库集合。为了方便其他开发者使用,我们决定对这些库进行开源。使用 Bolts 不需要依赖任何 Parse 服务,也不需要拥有 Parse 或 Facebook 开发者账号。

Bolts 包含

  • “Tasks”:简化了复杂异步代码的管理。Task 类似于 JavaScript 的 Promise,但支持 iOS 和 Android 开发。
  • App Links:提供了一个跨平台机制,允许开发者定义并发布多层链接,其他应用可以通过它链接到内容。

Task - 异步编程的高效解决方案

在移动应用开发中,异步操作是必不可少的。然而,传统的异步编程方法(如 callbacks 和 AsyncTask)往往会导致代码嵌套、资源占用和金字塔式代码结构。Task 类提供了更高效的解决方案:

  • 资源占用少:Task 只在需要时占用线程资源,不会阻塞 UI 线程。
  • 线程模型灵活:Task 不依赖特定的线程模型,可以在任何线程上执行。
  • 高度可组合:支持分支、并行和错误处理,无需繁琐的回调链。
  • 简化代码:通过 continueWith 和 onSuccess 方法,可以将多个操作串联起来,避免嵌套。
  • Task 的核心方法

    continueWith

    Task 提供了 continueWith 方法,用于接收 Continuation 对象。Continuation 的 then 方法将在 Task 完成时调用,可以检查 Task 是否成功、取消或失败,并获取结果。

    Task
    saveAsync(ParseObject obj) { return ParseObject.saveAsync(obj).continueWith( new Continuation
    () { @Override public Void then(Task
    task) throws Exception { if (task.isCancelled()) { // 任务已被取消 } else if (task.isFaulted()) { // 任务失败 Exception error = task.getError(); } else { // 任务成功 ParseObject object = task.getResult(); } return null; } });}

    onSuccess

    如果只需要处理成功回调,可以使用 onSuccess 方法:

    Task
    saveAsync(ParseObject obj) { return ParseObject.saveAsync(obj).onSuccess( new Continuation
    () { @Override public Void then(Task
    task) throws Exception { // 任务成功 return null; } } );}

    链式任务

    Task 的强大组合能力使得代码更加简洁。通过 continueWithTask 和 onSuccessTask,可以轻松实现链式任务:

    ParseQuery
    query = ParseQuery.getQuery("Student");query.orderByDescending("gpa");final Task
    findTask = ParseObject.findAsync(query);Task
    thenTask = findTask.continueWithTask( new Continuation
    >() { @Override public Task
    then(Task
    task) throws Exception { // 获取查询结果 ParseObject student = task.getResult(); // 执行后续操作 return saveAsync(student.put("valedictorian", true)); } });// 处理最终结果thenTask.continueWith( new Continuation
    () { @Override public Void then(Task
    task) throws Exception { return null; } });

    错误处理

    Task 提供了丰富的错误处理方式。通过 Continuation,可以在任务完成时处理错误或取消状态:

    Task
    findAsync(ParseQuery
    query) { return query.findAsync() .continueWithTask( new Continuation
    >() { @Override public Task
    then(Task
    task) throws Exception { if (task.isFaulted()) { throw new RuntimeException("查询失败"); } return task; } } );}

    创建任务

    除了内置的异步方法(如 saveAsync 和 findAsync),开发者还可以手动创建 Task:

    public static Task
    succeedAsync() { TaskCompletionSource
    source = new TaskCompletionSource<>(); source.setResult("成功结果"); return source.getTask();}public static Task
    failAsync() { TaskCompletionSource
    source = new TaskCompletionSource<>(); source.setError(new RuntimeException("错误信息")); return source.getTask();}

    任务执行器

    Task 提供了高度可定制的执行器(Executor),允许开发者控制任务执行的线程池:

    // 创建自定义线程池static final Executor NETWORK_EXECUTOR = Executors.newCachedThreadPool();static final Executor DISK_EXECUTOR = Executors.newCachedThreadPool();// 使用指定的 executorTask
    requestTask = Task.call( new Callable
    () { @Override public HttpResponse call() throws Exception { return client.execute(request); } }, NETWORK_EXECUTOR).continueWith( new Continuation
    >() { @Override public Task
    then(Task
    task) throws Exception { return processResponseAsync(task.getResult()); } }).continueWithTask( new Continuation
    >() { @Override public Task
    then(Task
    task) throws Exception { return writeToDiskAsync(task.getResult()); } }, DISK_EXECUTOR);

    App Links 提供了一个简单的 API,允许开发者定义和发布多层链接,其他应用可以通过它实现深度链接。

    在 Activity 中使用 AppLinks 工具类解析传入的 Intent:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Uri targetUrl = AppLinks.getTargetUrlFromInboundIntent(getIntent());    if (targetUrl != null) {        Bundle applinkData = AppLinks.getAppLinkData(getIntent());        String id = applinkData.getString("id");        Bundle referrerAppData = applinkData.getBundle("referer_app_link");        Bundle extras = AppLinks.getAppLinkExtras(getIntent());        String fbAccessToken = extras.getString("fb_access_token");    } else {        // 处理非 App Link 的情况    }}

    导航到 URL

    通过 App Link 简化导航流程:

    AppLinkNavigation navigate = new AppLinkNavigation(    link,    extras,    appLinkData);navigate.navigate();

    自定义解析器

    Bolts 允许开发者自定义解析器,优化 App Link 的处理:

    public class CustomAppLinkResolver implements AppLinkResolver {    @Override    public AppLinkNavigation resolveAppLink(Uri uri, Context context) {        // 自定义解析逻辑        return super.resolveAppLink(uri, context);    }}AppLinkNavigation.setDefaultResolver(new CustomAppLinkResolver());AppLinkNavigation.navigateInBackground(url);

    测量事件

    Bolts 提供了测量事件,帮助开发者分析 App Link 的使用情况。通过监听 al_nav_in 和 al_nav_out 事件,可以获取详细的导航数据。

    事件字段

    • al_nav_in

      • inputURL:打开 App 的 URL
      • inputURLScheme: URL 的 scheme
      • refererURL: 引用 App 的 URL
      • refererAppName: 引用 App 的名称
      • targetURL: App Link 的目标 URL
      • version: App Links API 版本
    • al_nav_out

      • outputURL: 用于打开其他应用或浏览器的 URL
      • outputURLScheme: URL 的 scheme
      • sourceURL: 生成 App Link 的页面 URL
      • success: “1” 表示成功导航,“0” 表示失败
      • type: “app” 表示在应用中打开,“web” 表示在浏览器中打开
      • version: App Links API 版本

    通过这些事件,开发者可以深入分析 App Link 的使用效果,优化用户体验。

    转载地址:http://dala.baihongyu.com/

    你可能感兴趣的文章
    PHP系列:浅谈PHP中isset()和empty() 函数的区别
    查看>>
    PHP索引数组unset的坑-array_values解决方案
    查看>>
    PHP索引数组排序方法整理(冒泡、选择、插入、快速)
    查看>>
    PHP线程安全和非线程安全
    查看>>
    R3LIVE开源项目常见问题解决方案
    查看>>
    php缃戠珯,www.wfzwz.com
    查看>>
    php缓存查询函数
    查看>>
    php编写TCP服务端和客户端程序
    查看>>
    php编码规范
    查看>>
    PHP编码规范-PSR1、psr2 /psr3 psr4
    查看>>
    PHP编程效率的20个要点
    查看>>
    PHP网页缓存技术优点及代码
    查看>>
    PHP自动化测试(一)make test 和 phpt
    查看>>
    php自定义函数: 文件大小转换成智能形式
    查看>>
    php英语单词,php常用英语单词,快速学习php编程英语(6)
    查看>>
    R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
    查看>>
    PHP获取curl传输进度
    查看>>
    PHP获取IP所在地区(转)
    查看>>
    PHP获取IP的方法对比
    查看>>
    php获取json里面内容
    查看>>