背景
before:
在我们APP启动过程,我们可能常常有这样的需求:在APP第一次进入的时候根据网络请求的结果弹一个对话框式的广告, ok~ 很简单,那么代码大致就是这样(这边都是伪代码,为了方便理解):
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
checkFirstDialogIfNeed();
}
/**
* step 1
*/
private void checkFirstDialogIfNeed(){
Utils.fakeRequest("http://www.api1.com", new HttpCallBack() {
@Override
public void onOk() {
showADialog();
}
@Override
public void onFailure() {
//do nothing
}
});
}
ok,做完上线
step1
过了一阵子,产品同学又跑过来了说:
“老板的需求,我们要在首页第一次进来的时候加一个注册协议的弹框”
程序员小A: “可是首页已经之前有一个弹框了,直接一起展示吗?”
产品同学: “一起弹出来体验不好,那你放在A弹框之后吧!”
ok,那么程序员小A寻思了一下,那应该就是这么改了:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
checkFirstDialogIfNeed();
}
private void checkFirstDialogIfNeed(){
Utils.fakeRequest("http://www.api1.com", new HttpCallBack() {
@Override
public void onOk() {
showADialog();
}
@Override
public void onFailure() {
//请求失败直接跳过,请求注册协议
checkRegisterAgreement();
}
});
}
private void showADialog() {
new AlertDialog.Builder(this)
.setTitle("这是一条有态度的广告")
.setPositiveButton("我看完了", null)
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
//弹框结束后请求注册协议
checkRegisterAgreement();
}
}).create().show();
}
private void checkRegisterAgreement() {
Utils.fakeRequest("http://www.api2.com", new HttpCallBack() {
@Override
public void onOk() {
showBDialog();
}
@Override
public void onFailure() {
//do nothing
}
});
}
这么下来,我们先请求接口APi1,如果成功了弹广告弹框A,弹框结束了调用注册协议的方法,如果APi1 请求失败,直接跳过广告弹框A,继而请求注册协议,当注册协议请求成功了弹出我们的注册协议弹框,这么下来,我们确实可以保证注册协议弹框在广告弹框之后~
step2
过了几天,产品同学又来了:“这次我们首页初次进来再加一个H5页面跳转,这次就加在 广告和注册协议之间吧…”
于是乎,小A继续改了改代码,整个代码就成了这样:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
checkFirstDialogIfNeed();
}
private void checkFirstDialogIfNeed() {
Utils.fakeRequest("http://www.api1.com", new HttpCallBack() {
@Override
public void onOk() {
showADialog();
}
@Override
public void onFailure() {
// //请求失败直接跳过,请求注册协议
// checkRegisterAgreement();
checkNeedShowH5();
}
});
}
private void showADialog() {
new AlertDialog.Builder(this)