1. 一个有趣Demo:

(1)定义一个handler变量

    private final Handler mHandler = new Handler();

(2)定义一个Runnable变量

private Runnable onDoSomethingRunnable = new Runnable() {
public void run() {
onDoSomething();
}
};

(3)定义onDoSomething()方法:

public void onDoSomething(){
..................................
.................................. mHandler.postDelayed(onDoSomethingRunnable,150); }

大家看一下上面的代码,发现了什么没。对,这个组合,可以 实现每隔一段时间,循环的执行某个操作。eg:每隔一秒,更新UI,每隔一段时间,去查看一个进程或者服务是否结束,............等等.当然了,大家可能会发现,一种方式可能有点消耗资源,因为他会循环的执行固定的操作,所以一般还是少用。

2. 一些关于Handler的事情:

A Handler allows you to send and process Message and Runnable objects associated with athread's MessageQueue

handler的作用,我就不说了,这种机制,我的理解是将一些非主UI线程更新UI,传递一些数据等等。当然,官方的说明:

There are two main uses for a Handler: (1) to schedule messages and runnablesto be executed as some point in the future; and (2) to enqueue anactionto be performed on a different thread than your own.

Handler中分发消息和runnable的一些方法:

post(Runnable),postAtTime(Runnable, long),postDelayed(Runnable, long),

sendEmptyMessage(int),sendMessage(Message),sendMessageAtTime(Message, long),sendMessageDelayed(Message, long)

Handler删除消息和runnable的方法:

removeCallbacks(Runnable), removeCallbacks(Runnable, Object ), removeCallbacksAndMessages(Object),

removeMessages(int),  removeMessages(int , Object )

3.几个经典的DEMO。

(1)在一段数据处理的耗时操作后,如果这个操作超过1s,就显示进度条,如果耗时操作不超过1s,则不显示进度条后

//Handler处理消息
final Handler handler = new Handler(); final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage(getText(R.string.adding_recipients));
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false); final Runnable showProgress = new Runnable() {
public void run() {
progressDialog.show();
}
}; // Only show the progress dialog if we can not finish off parsing the return data in 1s,
// otherwise the dialog could flicker.
handler.postDelayed(showProgress, 1000); new Thread(new Runnable() {
public void run() {
try {
//数据处理
} finally {
handler.removeCallbacks(showProgress);
progressDialog.dismiss();
}
}
}).start();

(2)更新UI界面

在需要更新页面的地方,发出更新界面的命令
private static final int UPDATE_PAGE_INDICATOR = 1;
/****更新用户选中的数目******/
private static final int UPDATE_SELE_COUNT = 2; /****更新页面指示器******/
Message msg = myHandler.obtainMessage();
Bundle bundle = new Bundle();
//bundle.putInt("page", page);
bundle.putInt("page", PageCurrent);
msg.setData(bundle); // 向消息中添加数据
msg.what = UPDATE_PAGE_INDICATOR;
myHandler.sendMessage(msg); // 向Handler发送消息,更新UI 在需要更新指示选中数目的TextView的地方,发出更新界面的命令
myHandler.sendEmptyMessage(UPDATE_SELE_COUNT); 更新界面的操作,都放在myHandler 中 /***********myHandler:更新界面***********/
public Handler myHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what)
{
case UPDATE_PAGE_INDICATOR :
Bundle data = msg.getData();
int page = (Integer) data.get("page");
/*****更新页面指示器******/
upDatePageIndicator(page);
break;
case UPDATE_SELE_COUNT:
mySelectCount.setText(""+selectCount);
break;
}
}
};

(3).Handler 和 Runnable 控制显示一个文本,1.5s后,让其不显示:

private TextView overlay = null;
LayoutInflater inflater = LayoutInflater.from(this);
overlay = (TextView) inflater.inflate(R.layout.overlay, null); private Handler <strong>handler</strong>;
handler = new Handler(); private OverlayThread <strong>overlayThread</strong>;
overlayThread = new OverlayThread(); overlay.setText(sections[position]);
overlay.setVisibility(View.VISIBLE);
<strong>handler.removeCallbacks(overlayThread);
/*****延迟一秒后执行,让overlay为不可见*****/
handler.postDelayed(overlayThread, 1500);</strong> /**
* 类描述:OverlayThread:实现设置overlay不可见
* @author hexiaoming
* @version
*/
private class OverlayThread implements Runnable { /**
* 方法描述:run方法
* @param
* @return
* @see OverlayThread
*/
public void run() {
overlay.setVisibility(View.GONE);
}
}

参考资料:

1.Android的Handler总结

http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html

转 android开发笔记之handler+Runnable的一个巧妙应用的更多相关文章

  1. Android开发笔记之:Handler Runnable与Thread的区别详解

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一 个类只要继承了Thread类同时覆写了本类中的run( ...

  2. android开发笔记:Handler、Looper、MessageQueen、Message的关系

    一.什么是handler? 注:线程分为主线程(主线程又叫UI线程,只能有一个主线程)和子线程(可以有多个)Handler只能在主线程里运行 handler是Android给我们提供用来更新UI的一套 ...

  3. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  4. Android开发笔记(一百三十四)协调布局CoordinatorLayout

    协调布局CoordinatorLayout Android自5.0之后对UI做了较大的提升.一个重大的改进是推出了MaterialDesign库,而该库的基础即为协调布局CoordinatorLayo ...

  5. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

  7. Android开发笔记:打包数据库

    对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...

  8. Android开发笔记--hello world 和目录结构

    原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SD ...

  9. [APP] Android 开发笔记 003-使用Ant Release 打包与keystore加密说明

    接上节 [APP] Android 开发笔记 002 5. 使用ant release 打包 1)制作 密钥文件 release.keystore (*.keystore) keytool -genk ...

随机推荐

  1. python连接集群mongodb,封装增删改查

    1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...

  2. 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...

  3. 学不懂Netty?看不懂源码?不存在的,这篇文章手把手带你阅读Netty源码!

    阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...

  4. python实现色彩空间转换

    目录: (一)调用转换函数实现图像色彩空间转换------ cv2.cvtColor函数 (二)色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪某一颜色 正文: (一)调用转换函数实现图 ...

  5. PAT A1020——已知后序中序遍历求层序遍历

    1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...

  6. 04373 C++程序设计 2019版 第一章习题五、程序设计题

    题目: 1.编写一个程序,将从键盘输入的n个字符串保存在一个一维数组A中.在输入字符串之前,先输入n的值.要求,数组A需要动态申请空间,程序运行结束前再释放掉. #include <iostre ...

  7. PowerDotNet平台化软件架构设计与实现系列(04):服务治理平台

    系统和系统之间,少不了数据的互联互通.随着微服务的流行,一个系统内的不同应用进行互联互通也是常态. PowerDotNet的服务治理平台发源于早期的个人项目Power.Apix.这个项目借鉴了工作过的 ...

  8. [cf787E]Till I Collapse

    考虑对询问分块,对于i<K的询问,暴力处理,时间复杂度为o(Kn):对于i>K的询问,发现答案都小于n/K且满足单调性,那么可以二分出每一段相同的答案,时间复杂度为$o(n^{2}log_ ...

  9. Nginx大厂面试需要掌握多少v1.21.3

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Nginx官网 最新版本为1.21.3 Nginx (engine x) 是一个开源的.高性能的HTTP和反向代理web服务 ...

  10. Linux排序数据

    1.sort 默认是按照字符大小来排序,如果要按照数字大小排序,需要加参数-n,-M按月排序 如:sort text.txt按字符大小排序 sort -n text.txt 按照数字大小排序 sort ...