Skip to content
异步链式库,类似RXJava,可以用于切换主线程,或者执行一串相互依赖的任务
Java
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
README.md
build.gradle
consumer-rules.pro
proguard-rules.pro

README.md

AsyncChain

基于AndroidX的异步链式调用库,方便的实现异步链式调用,例如A->B->C-D的依赖任务,同时可以解决线程切换写Handler的烦恼。

使用

AsyncChain
    .withWork(new AsyncChainRunnable(){
        void run(AsyncChainTask task){
            //执行一个异步操作
            doSomething1(new someCallback1(){
                void callback(newResult){
                    //标识一个行为出错了
                    task.onError(error)
                    //标识一个异步操作的结束,进行下一步操作
                    task.onNext(newResult);
                }
            })
        }
})
    .withMain(new AsyncChainRunnable(){
        void run(AsyncChainTask task){
            //使用异步操作的结果更新UI
            updateUI(lastResult);
            //标识整个异步链式结束了,即使后面还有行为没有执行也不会继续下去了
            task.onComplete(lastResult);
        }
})
    .errorMain(new AsyncChainErrorCallback(){
        error(AsyncChainError error){
            //在主线程处理错误
            //一旦error*方法执行,异步链就中断了
        }
    })
    .go(activity/fragment/view/context);

执行下一步

因为 with*() 方法里面的行为可能是异步的,所以没法使用返回值直接判断一个行为的结束,这里需要我们主动告诉 AsyncChain 我执行完毕了,即在每一个 AsyncChainRunnable 的里面都需要调用一次 task 来告诉框架异步操作执行完毕了,例如:

AsyncChain
    .withWork(new AsyncChainRunnable(){
        void run(AsyncChainTask task){
            //执行一个异步操作
            doSomething1(new someCallback1(){
                void callback(newResult){
                    //标识一个异步操作的结束
                    //标识一个异步操作的结束
                    //标识一个异步操作的结束
                    task.onNext(newResult);
                }
            })
        }
})
    .....

这里 AsyncChainTask 有四个方法,一个行为结束,想要执行下一个异步行为的话,需要调用 onNext(newResult) ,如果想要停止整个异步链则调用 onComplete() ,如果一个步骤出了错的话则执行 onError(error) ,这个操作会通过 AsyncChainErrorCallback 回调回来。

//AsyncChainTask.java
 
/**
* 某一个操作成功结束了,执行下一步
* @param newResult 当前异步行为的结果,传递给下一个步骤使用,可以传递null
*/
public void onNext(T newResult);
 
/**
* 某一个操作失败了
* @param error 错误信息
*/
public void onError(AsyncChainError error);
 
/**
* 整个异步链结束了,即使还有未执行异步操作,也不会执行了
*/
public void onComplete();
 
/**
 * 获取上一个一步行为的结果
 *
 * @return 来自于上一个步骤的{@link #onNext(lastResult)}
 */
public T getLastResult();

错误处理

当一个异步操作执行的时候出现了错误,会被框架 try/catch ,想要在出现错误的时候执行某些行为,只需要 .error*(@NonNull AsyncChainErrorCallback errorCallback) 即可,其中 error(callback) 表示在原有的线程执行, errorMain(callback) 表示在主线程执行, errorWork(callback) 表示在工作线程执行。如果不想处理错误,则不需要调用 error*(callback)

//AsyncChainLink.java
...
 
/**
 * 在报错的线程处理错误
 *
 * @param errorCallback 执行错误的时候的回调
 */
public AsyncChainLinkGo error(@NonNull AsyncChainErrorCallback errorCallback);
 
/**
 * 在工作线程处理错误
 *
 * @param errorCallback 执行错误的时候的回调
 */
public AsyncChainLinkGo errorWork(@NonNull AsyncChainErrorCallback errorCallback);
 
/**
 * 在主线程处理错误
 *
 * @param errorCallback 执行错误的时候的回调
 */
public AsyncChainLinkGo errorMain(@NonNull AsyncChainErrorCallback errorCallback);

延时操作

想要让一个行为延迟执行,这个也可以很方便的实现,只需要调用 delay(毫秒) 即可,例如:

//延迟1000毫秒,然后Toast提示
AsyncChain.delay(1000)
        .withMain(new AsyncChainRunnable() {
            @Override
            public void run(AsyncChainTask task) throws Exception {
                Toast.makeText(MainActivity.this,"你好世界",Toast.LENGTH_SHORT).show();
                task.onComplete();
            }
        }).go(this);

简述内部实现

AsyncChain.with* 创建一个新的 AsyncChainLink 类, AsyncChainLink 实现了 AsyncChainLifeCycleListner 接口,当 AsyncChainLink.go(*) 时会通过 AsyncChainManger 获取一个 AsyncChainLifeCycle 生命周期的实现,然后将 Link 添加到 AsyncChainLifeCycle 的生命周期状态监听接口列表里,同时执行 AsyncChainLink.start() 。当一个异步操作执行完毕调用 task.onNext(newResult) 的时候,本质上调用的是 AsyncChainManager.next(runId,reslut) ,因为 AsyncChainManager 持有里所有生命周期实现的Map,而生命周期实现里面持有了需要执行的 AsyncChainLink 列表,就可以找到这个异步操作的下一个操作进行执行。 img

You can’t perform that action at this time.