项目中经常会遇到依次显示多个弹窗的情况,例如进入首页以后先弹出更新提示弹窗,关闭以后再弹出运营弹窗,然后弹出其他业务弹窗等等。
常见的做法是嵌套调用:
dialogA.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
//trigger B Dialog
}
});
dialogB.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if(flagOpenC){
//trigger C Dialog
}
}
});
dialogC.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
}
});
这种方式容易处理出错,而且如果弹窗较多,就会导致多级嵌套。RxJava提供的方法Concat可以很好的处理这个问题。
Concat
Concat操作符将多个Observable的输出连接起来,使它们像单个Observable一样工作,第一个Observable发出的所有项目在第二个Observable发出的任何项目之前发出(依此类推)。
把Dialog变成Flowable
fun AlertDialog.toObservable(): Flowable<Boolean> {
return Flowable.create({ emitter ->
setOnDismissListener {
emitter.onComplete()
}
}, BackpressureStrategy.BUFFER)
}
采用Concat连接
val dialogA : Flowable<Boolean>
val dialogB : Flowable<Boolean>
val dialogC : Flowable<Boolean> = flagOpen? getDialogC() : Observable.<Boolean>empty()
Flowable.concat(dialogA, dialogB, dialogC, launchPsychologyTestDialog())
.subscribe({
}, throwable -> {
});
感谢大家的支持,如有错误请指正,如需转载请标明原文出处!