基于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 列表,就可以找到这个异步操作的下一个操作进行执行。
