博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何正确地使用android中的progressdialog
阅读量:6896 次
发布时间:2019-06-27

本文共 1686 字,大约阅读时间需要 5 分钟。

网上有很多关于progressdialog的用法的介绍,下面这个是最具代表性的:

其核心代码:

Handler handler = new Handler();   Runnable mTasks = new Runnable() {     public void run() {      //执行url获取内容操作     }    };    final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);    handler.post(mTasks);

我实际使用后的效果是:点击按钮后(我是把这一系列操作放在一个clicklistener里)UI界面就阻塞在那里,然后等task执行完毕之后才显示progressdialog并且一直会存在(当然如果你在这个task结束后添加一条dialog.dismiss语句就会发现progressdialog显示后立即就消失了,但是这个不是本文的重点)我在stackoverflow上发现不少人有同样的问题,但是并没有找到正确的答案,只是有人给出了asynctask类的方案(我没有实际使用这个方案,但是根据我最后的理解,这种方案应该也是可行的)

这个问题困扰了我一个下午的时间,要解释这个问题,就要简单说一下android的UI线程,android程序启动时,会启动一个对应的主线程(就是UI线程),这个线程负责和用户的交互(例如按下按钮,滑动等),我们只能在UI线程中访问android UI 工具包。但是对于一些很耗时的操作,如果我们在主线程里完成的话,主线程就不能响应用户的操作,这样就会产生类似windows程序失去响应的效果,所以大部分时候我们都会启动一个新的线程执行这些操作,但是要注意在新的线程里是不能修改UI界面的(只能在UI线程里修改UI界面)。比如说我们想下载一个url的html内容,然后显示在界面的一个Textview上,我们如果在新启动的线程里调用textview.settext()方法是不会生效的。

说了这么多,是为了说明handler的作用就是为了在其他线程里更新UI。比如我们如果用handler.post(run) (run的内容就是更新在textview)的话,就可以实现我们的目的。

回到正题,我们如果按照前述代码使用progressdialog的话,在执行完

final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);

这条语句之后

handler.post(mTasks);

这条语句虽然看起来是在mtask这个线程里执行,但是因为使用了handler类,所以效果实际还是等同于阻塞了UI线程。所以progressdialog就等到mtask执行完毕之后才显示了。因此我们正确的写法应该是这样的:

final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);     new Thread(){   public void run() {       //执行url获取内容操作             handle.post( //在这里面更新textview);     }    }.start();

最后如果希望在新线程执行完之后让progressdialog自动消失的话,就在新线程里利用handler执行dialog.dismiss()。这个内容在本文开头的链接里也有详细的介绍,在这里就不赘述了。

 

转载于:https://www.cnblogs.com/developerY/p/3145366.html

你可能感兴趣的文章
ios webview下纯JS实现长按
查看>>
数字证书简介及Java编码实现
查看>>
Haproxy安装与配置
查看>>
SSH登录启用Google二次身份验证
查看>>
设置java.library.path的值(Mac/Linux/Windows)
查看>>
旅游准备清单
查看>>
WPF圆角按钮与触发颜色变化
查看>>
m_Orchestrate learning system---十六、如何快速在一堆字符图标中找到所需
查看>>
Python GUI
查看>>
038 lock wait timeout exceeded;try restarting transaction
查看>>
idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到
查看>>
Java IO流学习总结
查看>>
Java 枚举(enum) 的常见用法和开发规范
查看>>
jar命令+7z:创建,替换,修改,删除Jar, war, ear包中的文件
查看>>
金融蝴蝶效应
查看>>
.Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式...
查看>>
go for-range中的循环变量
查看>>
Base 64 编码
查看>>
企业架构:ArchiMate 2.0 Highlights
查看>>
电子书下载:C# 5.0 in a Nutshell 5th
查看>>