如何正确地使用android中的progressdialog
网上有很多关于progressdialog的用法的介绍,下面这个是最具代表性的:
http://sd8089730.iteye.com/blog/1441610
其核心代码:
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()。这个内容在本文开头的链接里也有详细的介绍,在这里就不赘述了。
如何正确地使用android中的progressdialog的更多相关文章
- 如何正确的在Android中存储特定应用文件
原文地址:How to Correctly Store App-Specific Files in Android Christophe Versieux (Waza_be)发表了一篇rant abo ...
- Android开发之ProgressDialog在独立Thread线程中更新进度
简单的需求:在一个工作Thread中更新进度对话框ProgressDialog 遇到的问题: 1,创建需要Context,这个需要传进来 2,Thread中不能创建ProgressDialog,否则需 ...
- android中正确导入第三方jar包
android中正确导入第三方jar包 andriod中如果引入jar包的方式不对就会出现一些奇怪的错误. 工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug. 刚开始是这样引用 ...
- Android中ProgressDialog的简单示例
网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主 ...
- 【转载】总结一下Android中主题(Theme)的正确玩法
http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有& ...
- Android中的内存管理机制以及正确的使用方式
概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍
本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...
- android中MVC,MVP和MVVM三种模式详解析
我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...
随机推荐
- 13-JS中的面向对象
创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...
- C <string.h>常用函数介绍
1. strcpychar *strcpy(char *destin, char *source);功能:将source指向的字符串拷到destin. int main() { ]; "; ...
- 测试开发之前端——No4.HTML5中的事件属性
HTML5的事件属性. 属性 值 描述 onafterprint script 在打印文档之后运行脚本 onbeforeprint script 在文档打印之前运行脚本 onbeforeonload ...
- 教你构建好 SpringBoot + SSM 框架
来源:Howie_Y https://juejin.im/post/5b53f677f265da0f8f203914 目前最主流的 java web 框架应该是 SSM,而 SSM 框架由于更轻便与灵 ...
- php工厂模式的实例
* 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...
- web----Twisted
Twisted模块: Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等.
- java -d
DB_SERVER_URL="-Ddatasource.driver=oracle.jdbc.OracleDriver -Ddatasource.url=jdbc:oracle:thin:@ ...
- Codeforces Round #341 (Div. 2) E - Wet Shark and Blocks
题目大意:有m (m<=1e9) 个相同的块,每个块里边有n个数,每个数的范围是1-9,从每个块里边取出来一个数组成一个数,让你求组成的方案中 被x取模后,值为k的方案数.(1<=k< ...
- 012 HDFS API 文件读写代码演示
一:准备工作 1.新建class类 2.开启HDFS服务 3.将配置文件拷贝进resources路径 方便了Configuration的读取配置. 二:读出HDFS文件系统中的文件到控制台 4.读出在 ...
- Linux —— 常见指令及其英文全称
alias:给命令起别名 awk = "Aho Weiberger and Kernighan" ,三个作者的姓的第一个字母 bash:GNU Bourne-Again Shell ...