【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
之前我们介绍了Android主线程异步处理机制。通过Handler可以将消息放置到队列中等待处理。Handler可以控制消息放置在队列方式:sendMessage(), sendMessageAtFrontOfQueue(), sendMessageAtTime(), sendMessageDelayed()。在本例我们将利用sendMessageDelayed()实现一个延迟执行的小例子。
小例子
小例子很简单,UI见图。Activity的TextView可以显示Log信息(ADT中有时Log消息无法在LogCat中显示,LogCat觉得神啊神,不定会如何,所以也放在TextView中显示了)。点击OptionsMenu中的“Test Defered Handler”将会弹出一个Toast,用来模拟进行某些处理。和一般的触发不同,我们将延迟6秒才弹出框。

如果我们在主线程中采用Sleep(6000)的方式,就会使主线程在6秒内无响应,如果点击完菜单,马上就去进行其他UI操作,就会触发ANR警告。我们利用Handler的sendMessageDelayed(),可以要求在6秒后,将信息放置在队列中,排队处理,很简单就能实现。但是在本例,我们将展现一个小技巧,利用Handler做一个时钟计数器,步长1秒,计数从0开始,到5时,触发toast。
Handler的处理
public class DeferWorkHandler extends Handler{
private int count = 0; //计数器
private static final String DATE_MESSAGE="message"; //获取消息Data测试。消息中Data是Bundle
private MainActivity parentActivity = null;//记录主Activity,用于进行UI操作
public DeferWorkHandler(MainActivity inputParent){
parentActivity = inputParent;
}
@Override // 【4】消息处理触发handleMessage()回调消息,这是典型的异步处理方式。
public void handleMessage(Message msg) {
printInfo("handleMessage() is called. count = " + count);
printInfo("message's data : " + msg.getData().getString(DATE_MESSAGE));
//如果计数为5,则进行处理,如果未满5,则延迟1秒后,将消息放入队列。
if(count >= 5){
myWork();
return ;
}
count ++;
sendTestMessage(1);
}
private void sendTestMessage(int secs){
/*【1】 创建消息。通过handler将消息放入队列中,最好的方式是通过handler来获取消息,将自动完成消息和handler的关联,即可通过消息获得handler的参考,在处理消息时触发handler的回调函数handleMesage()。 obtainMessage()故名思议,不是创建,而是从全局的message池中获取,当消息处理完后,消息会被回收(环保啊)。 也可以用Message.obtain(handler,…)静态消息来获取。
obtainMessage();
obtainMessage(int what);
obtainMessage(int what, Object obj);
obtainMessage(int what, int arg1, int arg2);
obtainMessage(int what, int arg1, int arg2, Object obj);
如果消息存在跨进程的情况,Object obj要求采用Parcelable数据结构。一般而言更为便捷的方式通过setData()方式,如本例所采用的。如果只传递一些index用的整数,推荐利用arg1和arg2。
what是开发者定制的消息code,在处理消息时用于标识是哪类消息,用于知晓如何解析消息。what、object、arg1、arg2都是message的public fields。*/
Message msg = this.obtainMessage();
//【2】设置消息的Data
Bundle b = new Bundle();
b.putString(DATE_MESSAGE, "Hello world!");
msg.setData(b);
// 【3】延期secs秒后将消息放入队列,handler还可以使用sendMessage()马上将消息放入队列中
sendMessageDelayed(msg, secs*1000);
}
public void doSomeDeferredWork(){
printInfo("doSomeDeferredWork: something will be done later.");
count = 0;
sendTestMessage(1);
}
private void myWork(){
printInfo("Something is doing now.");
Toast.makeText(parentActivity, "Something is doing now",Toast.LENGTH_LONG).show();
}
private void printInfo(String s){
… … //在MainActivity和Logcat上显示信息
}
}
Activity的代码片段
private DeferWorkHandler deferHandler = null;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
... ...
if (id == R.id.menu_test_defered_handler) {
// 【0】创建Handler实例,由于在主Activity中创建,所以Handler中的handlerMessage()也将在主线程中执行。
if(deferHandler == null){
deferHandler = new DeferWorkHandler(this);
}
deferHandler.doSomeDeferredWork();
return true;
}
return super.onOptionsItemSelected(item);
}
后台线程和UI的互动
在某些场景,我们在主线程中创建Handler对象,在其他线程中通过handler对象将消息放入队列,则仍将放入主线程队列中进行排队处理。如果其他后台线程需要在UI中进行处理,可以通过这种方式实现后台线程和UI之间的互动。
相关小例子源代码可在Pro Android学习:了解Handler小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子的更多相关文章
- 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...
- 【转】 Pro Android学习笔记(九四):AsyncTask(3):ProgressDialog
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Progress Dialog小例子 我们 ...
- 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...
- 【转】 Pro Android学习笔记(九三):AsyncTask(2):小例子
目录(?)[-] 继承AsyncTask UI操作接口 使用AsyncTask 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn. ...
- 【转】Pro Android学习笔记(九):了解Content Provider(下下)
Content provider作为信息的读出,比较常见的还有文件的读写,最基础的就是二进制文件的的读写,例如img文件,音频文件的读写.在数据库中存放了该文件的路径,我们可以通过ContentPro ...
- 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 对于activity,消息是在OnCrea ...
- 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView
目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
随机推荐
- Kubernetes Controller Manager
Controller Manager 作为集群内部的管理控制中心,负责集群内的Node.Pod副本.Service Endpoint.NameSpace.ServiceAccount.Resource ...
- maven 一个简单项目 —— maven权威指南学习笔记(三)
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- 集成Facebook SDK
1. 下载SDK https://developers.facebook.com/docs/ios?locale=zh_CN 2. 如何集成 https://developers.facebook.c ...
- Flume-NG源码阅读之HDFSEventSink
HDFSEventSink是flume中一个很重要的sink,配置文件中type=hdfs.与此sink相关的类都在org.apache.flume.sink.hdfs包中. HDFSEventSin ...
- hdu 5877 Weak Pair dfs序+树状数组+离散化
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Prob ...
- postgresql查看数据库占用的物理存储空间大小
1.手动查看: 查看数据库postgres的oid postgres=# SELECT oid from pg_database where datname='postgres'; oid------ ...
- spring: ?.运算符
?.运算符 对于被调用方法的返回值来说,我们同样可以调用它的方法.例如,如果selectArtist()方法返回的是一个String,那么可以调用toUpperCase()将整个名字改为大写字母形式: ...
- UML用例建模解析(一)----------用例概述
UML(统一建模语言): 1. 绘制用例图 用例图是UML中比较简单的一种图形,它包含两个主要组成元素,分别是执行者(Actor)和用例(Use Case).执行者又称为参与者或角色,用例又称为用况或 ...
- JavaScriptSerializer 日期处理 JSON.Net
[WebMethod(Description = "取得所有人员 自带json")] [SoapHeader("key")] [ScriptMethod(Res ...
- JAX-RS介绍——Java API forRESTful WebServices,JAX-RS的目标是Web Services开发(这与HTML Web应用不同)而Spring MVC的目标则是Web应用开发
JAX-RS Java API forRESTful WebServices旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架.是一个J ...