做APP久了会发现,APP用户体验很重要,而往往用户体验是一点一点的细节慢慢累积的,今天我们就做一个联网提示的Dialog等待提示框,希望对大家有所帮助。
见过很多朋友和同事,普遍做法是在父类BaseActivity或者BaseFragment父类集成Dialog的初始化方法,然后在子类调用访问网络时show()出来,但是这样做每次都需要手动调用 show方法,完成时候调用dimiss方法,在网络请求很多的时候显得非常麻烦。
那么下面先给个父类的例子吧:
这里为了演示,调用系统Dialog:
ProgressDialog dialog = new ProgressDialog(context);
dialog.setTitle(title);
dialog.setMessage(message);
dialog.setIndeterminate(indeterminate);
dialog.setCancelable(cancelable);
dialog.setOnCancelListener(cancelListener);
在父类初始化dialog ,在子类,只需dialog .show(),其实从此类做法也很简单,但是从优化角度讲,父类代码量变大,并且子类调用稍显麻烦。
那么进入今天主题,根据网络请求状态自动显示和关闭。
因为根据网络访问状态显示和关闭Dialog,那么必然,需要网络请求,这里以xUtils3.0+为例,大家都知道,网络请求成功和失败都会有回调,那么回调里面我们可以做些什么呢?既然回调可以返回当前网络状态,那么把关闭和显示的步骤放这里面不就行了。
所以,这里我们需要修改xUtils的CallBack:
public abstract class CCallback<T> implements CommonCallback<T>{}
建一个抽象类,用来实现重写xUtils自带的回调方法。
这里我们需要重写三个回调方法:
onSuccess onError onFinished //回调分别为:成功、错误、完成
重点来了,我们在当前抽象类里面新建构造方法,为了使用方便和可控,我们新建两个构造,一个空构造和一个带参构造;
public CCallback() {
}
public CCallback(Context context) {
show = DialogUtils.show(context, "请稍后", "需要等待一下下哦", true, true);
if (dialog != null) {
dialog.show();
}
}```
在带参构造里面接收Context,这里如果在调用网络请求时,传入了Context那么我们就显示Dialog,如果没有传,根据需求,默认不显示。
@Override
public void onFinished() {
LogUtil.e("完成");
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
然后在网络请求完成的回调里,关闭即可。
自此,你的回调已经可以根据网络状态进行显示和关闭Dialog了。
网络请求时,调用方法:
RequestParams params = new RequestParams("http://www.baidu.com");
x.http().get(params, new CCallback() {//这里没传任何参数,调用无参构造,所以不显示Dialog
});
x.http().get(params, new CCallback(this) {//根据用户需求,这里传入了Context所以这里请求网络,会根据网络状况显示和关闭Dialog
});
写到这里大家明白了吗?