网上有很多关于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的更多相关文章

  1. 如何正确的在Android中存储特定应用文件

    原文地址:How to Correctly Store App-Specific Files in Android Christophe Versieux (Waza_be)发表了一篇rant abo ...

  2. Android开发之ProgressDialog在独立Thread线程中更新进度

    简单的需求:在一个工作Thread中更新进度对话框ProgressDialog 遇到的问题: 1,创建需要Context,这个需要传进来 2,Thread中不能创建ProgressDialog,否则需 ...

  3. android中正确导入第三方jar包

    android中正确导入第三方jar包 andriod中如果引入jar包的方式不对就会出现一些奇怪的错误. 工作的时候恰好有一个jar包需要调用,结果用了很长时间才解决出现的bug. 刚开始是这样引用 ...

  4. Android中ProgressDialog的简单示例

    网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主 ...

  5. 【转载】总结一下Android中主题(Theme)的正确玩法

    http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有& ...

  6. Android中的内存管理机制以及正确的使用方式

    概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...

  7. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  8. Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

    本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...

  9. android中MVC,MVP和MVVM三种模式详解析

    我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...

随机推荐

  1. 13-JS中的面向对象

    创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...

  2. C <string.h>常用函数介绍

    1. strcpychar *strcpy(char *destin, char *source);功能:将source指向的字符串拷到destin. int main() { ]; "; ...

  3. 测试开发之前端——No4.HTML5中的事件属性

    HTML5的事件属性. 属性 值 描述 onafterprint script 在打印文档之后运行脚本 onbeforeprint script 在文档打印之前运行脚本 onbeforeonload ...

  4. 教你构建好 SpringBoot + SSM 框架

    来源:Howie_Y https://juejin.im/post/5b53f677f265da0f8f203914 目前最主流的 java web 框架应该是 SSM,而 SSM 框架由于更轻便与灵 ...

  5. php工厂模式的实例

    * 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...

  6. web----Twisted

    Twisted模块: Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等.

  7. java -d

    DB_SERVER_URL="-Ddatasource.driver=oracle.jdbc.OracleDriver -Ddatasource.url=jdbc:oracle:thin:@ ...

  8. Codeforces Round #341 (Div. 2) E - Wet Shark and Blocks

    题目大意:有m (m<=1e9) 个相同的块,每个块里边有n个数,每个数的范围是1-9,从每个块里边取出来一个数组成一个数,让你求组成的方案中 被x取模后,值为k的方案数.(1<=k< ...

  9. 012 HDFS API 文件读写代码演示

    一:准备工作 1.新建class类 2.开启HDFS服务 3.将配置文件拷贝进resources路径 方便了Configuration的读取配置. 二:读出HDFS文件系统中的文件到控制台 4.读出在 ...

  10. Linux —— 常见指令及其英文全称

    alias:给命令起别名 awk = "Aho Weiberger and Kernighan" ,三个作者的姓的第一个字母 bash:GNU Bourne-Again Shell ...