Dialog显示加载中

本文介绍了在移动端网络不稳定情况下,如何使用加载Dialog缓解用户体验。通过引入第三方库并封装成工具类,方便在各种场景下展示和关闭。然而,这种方法可能导致内存泄漏和Dialog无法正确绑定。为解决这些问题,建议将Dialog置于BaseActivity中管理,并添加物理返回键监听,确保在网络不佳时能灵活控制Dialog的显示和关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移动端的的网络情况有的时候是很不稳定的(在地下室额,气死人)或是使用某些运营商的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中的比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值