All Projects → Luomingbear → AsyncChain

Luomingbear / AsyncChain

Licence: other
异步链式库,类似RXJava,可以用于切换主线程,或者执行一串相互依赖的任务

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to AsyncChain

Component
🔥🔥🔥A powerful componentized framework.一个强大、100% 兼容、支持 AndroidX、支持 Kotlin并且灵活的组件化框架
Stars: ✭ 2,434 (+14217.65%)
Mutual labels:  rxjava, androidx
modern-android
Modern Android Project Skeleton
Stars: ✭ 17 (+0%)
Mutual labels:  rxjava, androidx
iMoney
iMoney 金融项目
Stars: ✭ 55 (+223.53%)
Mutual labels:  rxjava
PokemonCards
Android Clean MVP Architecture with Dagger & Simple Package Structure
Stars: ✭ 28 (+64.71%)
Mutual labels:  rxjava
RxLoading
RxJava library for showing a loading (i.e. progress bar) state while waiting for async data with minimal effort and advanced options.
Stars: ✭ 49 (+188.24%)
Mutual labels:  rxjava
android-clean-architecture
Android Sample Clean Architecture App written in Kotlin. (MVVM, dagger2, RXjava, data binding, Live data,room)
Stars: ✭ 29 (+70.59%)
Mutual labels:  rxjava
jshodan
Powerful Shodan API client using RxJava and Retrofit
Stars: ✭ 56 (+229.41%)
Mutual labels:  rxjava
MusicUU
一款让你解决下歌烦恼的APP
Stars: ✭ 15 (-11.76%)
Mutual labels:  rxjava
AndroidTutorials
Ejemplos Android [Dagger2,RxJava,MVP,Retrofit2,SQLite]
Stars: ✭ 22 (+29.41%)
Mutual labels:  rxjava
ehhttp
OkHttp calls as RxJava types
Stars: ✭ 19 (+11.76%)
Mutual labels:  rxjava
ReactiveConnectivity
ReactiveConnectivity - a library for Listen Connectivity Change on Android
Stars: ✭ 22 (+29.41%)
Mutual labels:  rxjava
NewsReader
Android News Reader app. Kotlin Coroutines, Retrofit and Realm
Stars: ✭ 21 (+23.53%)
Mutual labels:  rxjava
BaseDevelop
an android project for now fashion open source framework
Stars: ✭ 24 (+41.18%)
Mutual labels:  rxjava
RxAnimator
An RxJava2 binding for android Animator
Stars: ✭ 80 (+370.59%)
Mutual labels:  rxjava
NavigationComponentPlayground
Sample app leveraging Android Navigation Component
Stars: ✭ 60 (+252.94%)
Mutual labels:  androidx
rxactivitylauncher
Provide a way to receive the results of the Activity by RxJava.
Stars: ✭ 19 (+11.76%)
Mutual labels:  rxjava
ShaderShowcaseApp
A Jetpack Compose-based app to exhibit all the beautiful GLSL Fragment shaders I have ever written, where you can set them as Live Wallpaper.
Stars: ✭ 173 (+917.65%)
Mutual labels:  androidx
neurosky-android-sdk
Android SDK for the NeuroSky MindWave Mobile Brainwave Sensing Headset
Stars: ✭ 39 (+129.41%)
Mutual labels:  rxjava
UseCases
This a library that offers a generic implementation of the data layers from the clean architecture by Uncle bob.
Stars: ✭ 23 (+35.29%)
Mutual labels:  rxjava
RxLocation
Use with rxjava,No memory leak,Simple
Stars: ✭ 52 (+205.88%)
Mutual labels:  rxjava

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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].