Android 下的 bolts tasks

Android 下的 bolts tasks

本文主要介绍的是在Android 下使用 bolts tasks, bolts tasks 可以很方便的让我们将一些异步task关联起来执行。让这些tasks有顺序的执行(当我们一个task的执行要基于另一个task的时候)。

1. github 地址 Bolts-Android

2. gradle中引用

dependencies {
compile ‘com.parse.bolts:bolts-android:1.2.0‘
}

3. 具体的使用

(我也是初学者,只是偶尔用过一次。理解的也很简单,我只是列出这个库里面我用到的一些方法,望见谅)

既然是task 肯定要知道他在那个线程中运行的。 Boots tasks 源码中总共有三种形式

  /**
    * An {@link java.util.concurrent.Executor} that executes tasks in parallel.
    */
  public static final ExecutorService BACKGROUND_EXECUTOR = BoltsExecutors.background();

  /**
   * An {@link java.util.concurrent.Executor} that executes tasks in the current thread unless
   * the stack runs too deep, at which point it will delegate to {@link Task#BACKGROUND_EXECUTOR} in
   * order to trim the stack.
   */
  private static final Executor IMMEDIATE_EXECUTOR = BoltsExecutors.immediate();

  /**
   * An {@link java.util.concurrent.Executor} that executes tasks on the UI thread.
   */
  public static final Executor UI_THREAD_EXECUTOR = AndroidExecutors.uiThread();

BACKGROUND_EXECUTOR 我把他理解成是后台线程。
IMMEDIATE_EXECUTOR 我把他理解成是当前线程,当然如果当前线程路径太深也会是后台线程。
UI_THREAD_EXECUTOR 我把他理解是UI线程(Handler(Looper.getMainLooper()).post())

1). 执行单个的任务

        Task.callInBackground(new Callable<Boolean>() {
        @Override
        public Boolean call() throws Exception {
            // 处理一些具体的动作
            return true;
        }
    });

我把他理解成是后台异步处理。

        Task.call(new Callable<Boolean>() {
        @Override
        public Boolean call() throws Exception {
            // 处理一些具体的动作
            return true;
        }
    });

我把他理解成是在同一个线程执行。

        Task.call(new Callable<Boolean>() {
        @Override
        public Boolean call() throws Exception {
            // 处理一些具体的动作
            return true;
        }
    }, Task.UI_THREAD_EXECUTOR);

UI线程执行。

2). 多个任务顺序执行

        Task.call(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            // show waiting dialog
            showWaitingDialog(R.string.waiting_for_get_wifi_mode);
            return null;
        }
    }).onSuccess(new Continuation<Void, WifiMode>() {
        @Override
        public WifiMode then(Task<Void> task) throws Exception {
            RouterManager routerManager = getRouterManager();
            return routerManager.getWifiMode();
        }
    }, Task.BACKGROUND_EXECUTOR).continueWith(new Continuation<WifiMode, Void>() {
        @Override
        public Void then(Task<WifiMode> task) throws Exception {
            // dismiss dialog
            dismissWaitingDialog();
            // set ui
            if (task.isFaulted()) {
                changeUiByWifiMode(mConnectMode);
            } else if (task.isCompleted()) {
                mConnectMode = task.getResult();
                changeUiByWifiMode(mConnectMode);
            }
            return null;
        }
    }, Task.UI_THREAD_EXECUTOR);

第一个任务(Task.call的任务) 是在调用者的同一个线程执行。我这里做的动作只是显示waitting dialog。
第二个任务(onSuccess跟上的任务)注意onSuccess的第二个参数是 Task.BACKGROUND_EXECUTOR 表示在后台执行可以做一些耗时的操作,并且会把返回值传到下一个任务。
第三个任务(continueWith跟上的任务)是获取到上一个任务的返回值。在做一些具体的动作。
onSuccess 顾名思义是在第一个任务成功执行的基础上在执行的(第一个任务没有抛异常)。continueWith 顾名思义是在上一个任务执行完的基础上执行的不管有没有抛异常都会执行(当有异常的时候我们会在下文中提到怎么获取到异常)。
3). 多个任务并行执行。

        Task.call(new Callable<Boolean>() {
        @Override
        public Boolean call() throws Exception {
            return true;
        }
    }, Task.UI_THREAD_EXECUTOR).onSuccess(new Continuation<Boolean, List<Task<ReachableIP>>>() {
        @Override
        public List<Task<ReachableIP>> then(Task<Boolean> task) throws Exception {
            List<Task<ReachableIP>> tasks = new ArrayList<Task<ReachableIP>>();
            tasks.add(getGatewayAsync());
            tasks.add(getRouterWanIpAsync());
            Task.whenAll(tasks).waitForCompletion();
            return tasks;
        }
    }, Task.BACKGROUND_EXECUTOR).onSuccess(new Continuation<List<Task<ReachableIP>>, ReachableIP>() {
        @Override
        public ReachableIP then(Task<List<Task<ReachableIP>>> task) throws Exception {
            List<Task<ReachableIP>> tasks = task.getResult();
            for (Task<ReachableIP> t : tasks) {
                if (t.isCompleted()) {
                    ReachableIP reachableIP = t.getResult();
                }
            }
            return null;
        }
    }).onSuccess(new Continuation<ReachableIP, Void>() {

第二个任务中会执行两个任务,等两个任务都执行完了才会往下执行,第三个任务可以获取到上一个中的两个任务的返回值

两个任务的具体声明如下实现部分我去掉了,ReachableIP是自定义的class:

private Task<ReachableIP> getGatewayAsync() {
    return Task.callInBackground(new Callable<ReachableIP>() {
        @Override
        public ReachableIP call() throws Exception {
            return null;
        }
    });
}

private Task<ReachableIP> getRouterWanIpAsync() {
    return Task.callInBackground(new Callable<ReachableIP>() {
        @Override
        public ReachableIP call() throws Exception {
            return null;
        }
    });
}

4). Exception处理

        }, Task.BACKGROUND_EXECUTOR).continueWith(new Continuation<BindDeviceInfo, Void>() {
        @Override
        public Void then(Task<BindDeviceInfo> task) throws Exception {
            if (task.isFaulted()) {
                Exception exception = task.getError();
                if (exception instanceof ResponseError) {
                    ResponseError e = (ResponseError) exception;
                    switch (e.errorCode()) {
                        case ErrorCode.PASSWORD_ERROR:
                            ......
                            break;
                        default:
                            break;
                    }
                }
            }
            return null;
        }
    }, Task.UI_THREAD_EXECUTOR);

因为任务在哪里有异常我们是可以预知到的,当有异常的时候,我们catch到再转换为我们自己的异常在thorw出来如上面的ResponseError 是我们自定义的异常,这样我们task.getError出来了可以做不同的处理。

时间: 2024-10-28 16:33:05

Android 下的 bolts tasks的相关文章

Gradle 载入中 Android 下一个.so档

1.在project下新建 jni/libs  目录   . jni 是和原来的libs  同级 ,将全部的.so文件放入 新建的libs文件下 2.在build.gradle 文件里新增下面内容到android{ } 下 task copyNativeLibs(type: Copy) { from(new File(project(':HealthCare').getProjectDir(), 'libs')) { include '**/*.so' } into new File(build

Android 下拉刷新的实现。使用 SwipeRefreshLayout 代替 pull-to-refesh

概述 谷歌官方推出了SwipeRefreshLayout 来实现下拉刷新的效果.对比以前我们常用的 pull-to-refesh ,这个方案显得更加的简单方便. 关联项目引用(管理依赖) 在你的 应用级别的 build.gradle  中添加如下: compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.android.support:support-v4:23.0.0' 编写布局(Layout) <LinearLayout

Android下将图片载入到内存中

Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当载入到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,以下我就来带大家创建一个用来图片缩放的应用: 应用效果图例如以下: 核心代码的实现: package com.examp.loa

fiddler Android下https抓包全攻略

fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考. 一.普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”.同时,由于我

Android下pm 命令详解

Sam在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之.0. Usage: usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list ins

android下的单元测试

android下的单元测试 在AndroidManifest.xml文件中配置以下信息: 在manifest节点下添加: <!-- 指定测试信息和要测试的包 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.jxn.junittest" /> 在application节点下添加: <!

cocos搭建android下的开发环境

没想到cocos3.2也出现了一点bug,还要经过一周晚上的努力,全部搞定.可以在android下使用啦 上个截图庆祝下 有需要的可以看http://item.taobao.com/item.htm?id=40745006457 cocos搭建android下的开发环境,布布扣,bubuko.com

Android下EditText的hint的一种显示效果------FloatLabelLayout

效果: 此为EditText的一种细节,平时可能用的不多,但是用户体验蛮好的,特别是当注册页面的项目很多的时候,加上这种效果,体验更好 仅以此记录,仅供学习参考. 参考地址:https://gist.github.com/chrisbanes/11247418 采用的是Android 3.0的动画,所以有版本限制,可以用  nineoldandroids  做向下兼容 ,当然上面的网址也给了另一种方式做向下兼容. demo地址:http://download.csdn.net/detail/ab

Android下的动画

        ------你需要努力,你还没资格休息----- Android下的动画有三种: tween补间动画.frame帧动画.property属性动画(Android3.0后提出来的). 补间动画: Translation(平移).Rotation(旋转).Alpha(透明).Scale(缩放) 代码方式:透明动画AlphaAnimation alpha=new AlphaAnimation(0,1); alpha.setDuration(2000);//执行的时间 alpha.set