移动端的的网络情况有的时候是很不稳定的(在地下室额,气死人)或是使用某些运营商的SIM卡,有的时候进出地铁就会没信号,所以造成数据加载很慢,假如我们没有对这块做处理,App的使用者就会很烦躁(一般不超过5秒),所以就有了当在加载数据的时候,显示一个正在加载,会让使用者的情绪得到一定的缓解。
这个哥们的Dialog就写的不错,这个dialog是仿ios的加载弹窗 ,以下是原作者的地址及使用:
原作者的项目地址
1、项目下的build.gradle添加
allprojects {
repositories {
…
maven { url ‘https://www.jitpack.io’ }
}
}
2、模块下的build.gradle添加依赖
dependencies {
compile ‘com.github.gittjy:LoadingDialog:1.0.2’
}
3、在代码中使用
LoadingDailog.Builder loadBuilder=new LoadingDailog.Builder(this)
.setMessage(“加载中…”)
.setCancelable(true)
.setCancelOutside(true);
LoadingDailog dialog=loadBuilder.create();
dialog.show();
不过由于Dialog的特殊性,不需要和Activity attach,所以我把这个dialog封装到了一个utils中了,代码如下:
public class Utils {
private static LoadingDialog.Builder loadBuilder;
private static LoadingDialog loadingDialog;
/**
* 显示加载中对话框
*/
public static void showLoadingDialog(Context context) {
loadBuilder = new LoadingDialog.Builder(context).setMessage("加载数据中...")
.setCancelable(false)
.setCancelOutside(false);
loadingDialog = loadBuilder.create();
if (loadingDialog != null && context != null) {
loadingDialog.show();
}
}
/**
* 关闭加载对话框
*/
public static void closeLoadingDialog() {
if (loadingDialog != null) {
loadingDialog.dismiss();
}
loadingDialog = null;
}
在需要使用Dialog的地方使用Utils.showLoadingDialog(context),在需要关闭的地方使用Utils.closeLoadingDialog()。这样可以再大多数的场合使用了,但是当这个dialog开启后,你使用任何别的办法是关闭不了的,除非这个Dialog呗调用了Utils.closeLoadingDialog()。当我在网络请求中使用这个的时候,由于网络并不好,那画面就剩下这个加载中…当时点击空白处消失不了,点击物理键返回不好使。这就让我郁闷了…(容我悲伤逆流成河吧…)。当网络不好的时候,我不想等待了,就直接把这个Activity结束掉(不用再等待这个无奈的返回结果了),所以我对这个Dialog进行了二次的开发。重新写一个class,继承于LoadingDailog(其实可以把原作者的这个类拷贝一份,重新写下),加一个对物理返回键的监听(本着编写一次代码,可以到处运行的精神,我把这个方法加在了这个类中,让这个Dialog进行管理),代码如下:
setListener()这个方法是加在你继承于LoadingDailog这个类中的
public void setListener() {
setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (dialog != null)
dialog.dismiss();
if (context != null) {
Activity activity = (Activity) context;
activity.finish();
}
}
return false;
}
});
}
调用还是依旧只不过是在showLoadingDialog()方法中添加一个 loadingDialog.setListener()就可以了。
loadingDialog1.setListener();这句代码是重点。
代码如下:
LoadingDialog1是我继承于LoadingDialog这个类的
public static void showLoadingDialog(Context context) {
loadBuilder = new LoadingDialog1.Builder(context).setMessage("加载数据中...")
.setCancelable(false)
.setCancelOutside(false);
loadingDialog1 = loadBuilder.create();
if (loadingDialog1 != null && context != null) {
loadingDialog1.setListener();
loadingDialog1.show();
}
}
完整代码如下:
public class LoadingDialog1 extends LoadingDailog {
private Context context;
public LoadingDialog1(Context context) {
super(context);
this.context = context;
}
public LoadingDialog1(Context context, int themeResId) {
super(context, themeResId);
this.context = context;
}
public static class Builder {
private Context context;
private String message;
private boolean isShowMessage = true;
private boolean isCancelable = false;
private boolean isCancelOutside = false;
public Builder(Context context) {
this.context = context;
}
public LoadingDialog1.Builder setMessage(String message) {
this.message = message;
return this;
}
public LoadingDialog1.Builder setShowMessage(boolean isShowMessage) {
this.isShowMessage = isShowMessage;
return this;
}
public LoadingDialog1.Builder setCancelable(boolean isCancelable) {
this.isCancelable = isCancelable;
return this;
}
public LoadingDialog1.Builder setCancelOutside(boolean isCancelOutside) {
this.isCancelOutside = isCancelOutside;
return this;
}
//这个layout是使用了原作者的了
public LoadingDialog1 create() {
LayoutInflater inflater = LayoutInflater.from(this.context);
View view = inflater.inflate(com.android.tu.loadingdialog.R.layout.dialog_loading, (ViewGroup) null);
LoadingDialog1 loadingDialog1 = new LoadingDialog1(this.context,
com.android.tu.loadingdialog.R.style.MyDialogStyle);
TextView msgText = (TextView) view.findViewById(com.android.tu.loadingdialog.R.id.tipTextView);
if (this.isShowMessage) {
msgText.setText(this.message);
} else {
msgText.setVisibility(View.VISIBLE);
}
loadingDialog1.setContentView(view);
loadingDialog1.setCancelable(this.isCancelable);
loadingDialog1.setCanceledOnTouchOutside(this.isCancelOutside);
return loadingDialog1;
}
}
public void setListener() {
setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (dialog != null)
dialog.dismiss();
if (context != null) {
Activity activity = (Activity) context;
activity.finish();
}
}
return false;
}
});
}
}
**
后记:
**
但是这种写在utils中的做法是不好的(1,有内存泄漏的危险;2,经常找不到activity,由于dialog的运行时绑定到activity中的),经过线上运行,发现经常是dialog绑定不到decorview上。所以想了想还是把这个dialog写在BaseActivity中的比较好。