Handler机制是实现线程之间通讯的一种很常见的方法,很多时候都会用到。

package com.lab.activity;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ProgressDialogTest extends Activity {
// 该程序模拟填充长度为100的数组
private int[] data = new int[100];
int hasData = 0;
// 定义进度对话框的标识
final int PROGRESS_DIALOG = 0x112;
// 记录进度对话框的完成百分比
int progressStatus = 0;
ProgressDialog pd;
// 定义一个负责更新的进度的Handler
Handler handler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button execBn = (Button) findViewById(R.id.exec);
execBn.setOnClickListener(new OnClickListener() {
public void onClick(View source) {
showDialog(PROGRESS_DIALOG);
}
});
//Handler消息处理
handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == PROGRESS_DIALOG){
pd.setProgress(progressStatus);
}
};
}; }
@Override
public Dialog onCreateDialog(int id, Bundle status) {
System.out.println("create");
switch (id) {
case PROGRESS_DIALOG:
// 创建进度对话框
pd = new ProgressDialog(this);
pd.setMax(100);
// 设置对话框的标题
pd.setTitle("任务完成百分比");
// 设置对话框 显示的内容
pd.setMessage("耗时任务的完成百分比");
// 设置对话框不能用“取消”按钮关闭
pd.setCancelable(false);
// 设置对话框的进度条风格
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度
pd.setIndeterminate(false);
break;
}
return pd;
}
// 该方法将在onCreateDialog方法调用之后被回调
@Override
public void onPrepareDialog(int id, Dialog dialog) {
System.out.println("prepare");
super.onPrepareDialog(id, dialog);
switch (id) {
case PROGRESS_DIALOG:
// 对话框进度清零
pd.incrementProgressBy(-pd.getProgress());
new Thread() {
public void run() {
while (progressStatus < 100) {
// 获取耗时操作的完成百分比
progressStatus = doWork(); // 发送消息到Handler
Message message = handler.obtainMessage();
message.what = PROGRESS_DIALOG;
handler.sendMessage(message); }
// 如果任务已经完成
if (progressStatus >= 100) {
// 关闭对话框
pd.dismiss();
}
}
}.start();
break;
}
}
// 模拟一个耗时的操作。
public int doWork() {
// 为数组元素赋值
data[hasData++] = (int) (Math.random() * 100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return hasData;
}
}

安卓Handler机制的例子的更多相关文章

  1. Handler机制原理图、源码、使用!!!!!

    android的消息处理机制——Looper,Handler,Message  (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨 ...

  2. Android Handler 机制 - Looper,Message,MessageQueue

    Android Studio 2.3 API 25 从源码角度分析Handler机制.有利于使用Handler和分析Handler的相关问题. Handler 简介 一个Handler允许发送和处理M ...

  3. 简述Handler机制

    我会对android的消息处理有三个核心类逐步介绍,他们分别是:Looper,Handler和Message.其实还有一Message Queue(消息队列),知道它是队列即可,就像我们所熟知的数组, ...

  4. Android Handler机制剖析

    android的handler机制是android的线程通信的核心机制 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃. Android中的实现了 接收消息的& ...

  5. Android 异步通信:图文详解Handler机制工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 今天,我将图文详解 Handler机制 的工作原理,希望你们会喜欢 目录 1. 定义 一套 Android 消息传递机制 2. ...

  6. Android源码分析笔记--Handler机制

    #Handler机制# Handler机制实际就是实现一个 异步消息循环处理器 Handler的真正意义: 异步处理 Handler机制的整体表述: 消息处理线程: 在Handler机制中,异步消息处 ...

  7. 【转载】Android 的 Handler 机制实现原理分析

    handler在安卓开发中是必须掌握的技术,但是很多人都是停留在使用阶段.使用起来很简单,就两个步骤,在主线程重写handler的handleMessage( )方法,在工作线程发送消息.但是,有没有 ...

  8. Handler机制与生产者消费者模式

    本文梳理了 Handler 的源码,并详细阐述了 Handler 与生产者消费者模式的关系,最后给出了多版自定义 Handler 实现.本文首发于简书,重新整理发布. 一.Handler Handle ...

  9. Android的Handler机制

    Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...

随机推荐

  1. HDU4632:Palindrome subsequence(区间DP)

    Problem Description In mathematics, a subsequence is a sequence that can be derived from another seq ...

  2. squid 安装、配置、优化

    官方网站:http://www.squid-cache.org 下载路径:wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABL ...

  3. MyEclipse设置默认的目光格式

    首先,选择菜单 windows-->preference Java-->Code Style-->Code Templates code-->new Java files 然后 ...

  4. iOS开发——总结篇&IOS开发基础知识

    IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...

  5. 兼容:判断 iframe 是否加载完成

    判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似 var iframe = document.createElement("iframe ...

  6. android学习日记19--四大组件之BroadcastReciver(广播接收者)

    二.BroadcastReciver(广播接收者) 1.简述 BroadcastReciver位于android.content包下,主要用于对广播消息(Intent)的过滤并响应的控件.可以理解为全 ...

  7. iPad 3g版完美实现打电话功能(phoneitipad破解)

    看到这个标题,有的同学可能吐槽,iPad 用来打电话,多雷人啊,人家apple设计的时候没加电话功能是有益这样做的. 只是这次真的有这种需求,一台測试用的iPad 1 3G版的机器,放进去了一张3G电 ...

  8. [009]C---关于输出文本的打印问题

    现在有这样一个问题: 针对一个long类型的变量,我们想把它打印成为32位显示. #include "stdio.h" int main() { long i =0xa; prin ...

  9. XMemcached使用示例--转

    Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端 ...

  10. js原生bind()用法[注意不是jquery里面的bind()]

    <div id="a"> <div></div> <div></div> <div></div> ...