当前位置: 首页 > article >正文

6-4.Android 对话框之进度对话框问题清单(UI 线程问题、外部取消、dismiss 方法与 hide 方法)

对话框

  1. 对话框(Dialog)是一种常用的 UI 组件,它主要用于显示信息、接收用户操作反馈

  2. 对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表

  3. 其中,基础对话框是 Android 中最简单的对话框,而后是进度对话框、自定义对话框等


一、UI 线程问题

1、非 UI 线程中创建对话框
  • 非 UI 线程中创建对话框会抛出异常
new Thread(() -> {
    try {
        ProgressDialog progressDialog = new ProgressDialog(this);

        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setTitle("加载对话框");
        progressDialog.setMessage("加载中~~~");

        progressDialog.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();
  • 输出结果
java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()
2、非 UI 线程中显示对话框
  • 非 UI 线程中显示对话框会抛出异常
ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");

new Thread(() -> {
    try {
        progressDialog.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();
  • 输出结果
java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()
3、非 UI 线程中关闭对话框
  • 非 UI 线程中关闭对话框不会抛出异常
ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");

progressDialog.show();

new Thread(() -> {
    try {
        Thread.sleep(5 * 1000);
        progressDialog.dismiss();
    } catch (Exception e) {
        e.printStackTrace();
    }
}).start();

二、外部取消

1、加载对话框外部取消
  1. 通过 setCancelable(boolean cancelable) 方法设置加载对话框是否可以通过点击外部区域来取消

  2. 建议对加载对话框禁止点击外部区域来取消,因为加载对话框的取消通常应该由业务代码控制

ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");

progressDialog.setCancelable(false); // 建议使用

progressDialog.show();
2、进度条对话框外部取消
  1. 通过 setCancelable(boolean cancelable) 方法设置进度条对话框是否可以通过点击外部区域来取消

  2. 建议对进度条对话框禁止点击外部区域来取消,因为加载对话框的取消通常应该由业务代码控制

ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("进度条对话框");
progressDialog.setMessage("加载中~~~");
progressDialog.setMax(100);

progressDialog.setCancelable(false); // 建议使用

progressDialog.show();

new Thread(() -> {
    for (int j = 0; j <= 100; j++) {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        progressDialog.setProgress(j);
    }
    progressDialog.dismiss();
}).start();

三、dismiss 方法与 hide 方法

1、基本介绍
  1. dismiss 方法:用于完全关闭并移除 ProgressDialog,一旦调用此方法,ProgressDialog 将不再显示在屏幕上,且相关的资源会被移除

  2. hide 方法:用于关闭 ProgressDialog,一旦调用此方法,ProgressDialog 将不再显示在屏幕上,但相关的资源不会被移除

2、演示
ProgressDialog progressDialog = new ProgressDialog(this);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setTitle("加载对话框");
progressDialog.setMessage("加载中~~~");

progressDialog.show();

Handler handler = new Handler();

handler.postDelayed(() -> progressDialog.hide(), 5 * 1000);

http://www.kler.cn/news/358510.html

相关文章:

  • MySQL-21.多表设计-案例-关系分析-表结构
  • 数据结构与算法——Java实现 41.对称二叉树
  • 基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率
  • 2024-10-15 问AI: [AI面试题] 人工智能中使用了哪些不同的搜索算法?
  • 《Windows PE》7.3 遍历资源表
  • PostgreSQL学习笔记:PostgreSQL vs MySQL
  • 汽车票在线预订:SpringBoot技术实践
  • 探索程序之道:为什么要开发程序
  • R语言详解predict函数
  • Python 网络爬虫入门与实战
  • [C#][winform]基于yolov8的8种人脸表情检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
  • copliot竞品——豆包MarsCode
  • YoloV10改进策略:注意力改进|DeBiFormer,可变形双级路由注意力|引入DeBiLevelRoutingAttention注意力模块(全网首发)
  • Java综合项目(day38)
  • 如何挑选可靠的全球HTTP代理?
  • 一、Linux:开源传奇在大数据领域的璀璨绽放
  • c4d渲染和3d渲染有什么区别?c4d和3dmax哪个容易学?
  • 数据结构-5.10.树和森林的遍历
  • K14836 加密通话(call)
  • qt QGraphicsEffect详解