You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android自定义AlertDialog加载数据时无法取消关闭问题求助

问题根因

你遇到的两个问题都是调用逻辑错误导致的:

  • 每次调用Utils.setProgressDialog()都会创建一个全新的AlertDialog实例,你在点击事件里第一次调用生成的对话框会正常弹出,后续调用cancel()、dismiss()时又两次调用了该方法,操作的是两个新生成的不可见实例,最早弹出的对话框始终没有收到关闭指令,自然无法消失。
  • postViewModel.getPosts()是异步请求逻辑,你之前把关闭对话框的代码紧跟在请求发起代码之后,请求还没执行完成就已经触发了关闭逻辑,对话框甚至还没完成绘制就被销毁,所以看不到弹出效果。

修复方案

1. 调用逻辑修改

只在发起请求前创建一次对话框实例并保存引用,在ViewModel的请求结果回调(成功/失败)中再调用关闭方法,示例代码如下:

binding.loadMoreBtn.setOnClickListener(view -> {
    // 仅创建一次对话框实例,保存引用
    AlertDialog loadingDialog = Utils.setProgressDialog(requireContext());

    if (Utils.hasNetworkAccess(requireContext())) {
        postViewModel.getPosts();
    } else {
        postViewModel.getAllItemsFromDataBase.getValue();
    }

    // 观察请求成功的LiveData回调
    postViewModel.getPostsLiveData().observe(getViewLifecycleOwner(), posts -> {
        if (loadingDialog != null && loadingDialog.isShowing()) {
            loadingDialog.dismiss();
        }
        // 此处添加列表更新逻辑
    });
    
    // 观察请求失败的LiveData回调,异常场景也要关闭对话框
    postViewModel.getRequestErrorLiveData().observe(getViewLifecycleOwner(), errorMsg -> {
        if (loadingDialog != null && loadingDialog.isShowing()) {
            loadingDialog.dismiss();
        }
        Toast.makeText(requireContext(), "加载失败:" + errorMsg, Toast.LENGTH_SHORT).show();
    });
});

2. 可选优化(Utils方法)

如果需要支持用户点击返回键关闭加载框,可以修改setProgressDialog中的配置:

// 原配置
builder.setCancelable(false);
// 改为true即可支持返回键关闭
builder.setCancelable(true);

内容的提问来源于stack exchange,提问作者Dr Mido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:45:03