Android中的Handler,以及用Handler延迟执行
项目中遇到一个情况,先生成文件再上传;但有时候发出指令后上传会不成功,需要再发一次指令方能上传。
猜想是由于文件还没生成就执行「上传」指令了。想到要延时。Android中单纯用currentThread.sleep()方法好像是不行的,要用「Handler」。
用以下代码成功实现延时:
new Handler().postDelayed(new Runnable(){
public void run() {
//显示dialog
}
}, 5000); //5秒
补充:API是这么解释的:
「There are two main uses for a Handler: (1) to schedule messages and runnables to be executed as some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.」
参考:
http://www.cnblogs.com/meieiem/archive/2011/11/11/2245245.html
http://developer.android.com/reference/android/os/Handler.html
---------------------Mar.26,2014分割线-----------------------
今天是Mar.26,2014,从Mars老师的视频里摘录一些Handler的东西:
1.Handler负责把消息对象加入到消息队列尾部;Looper是一个「循环器」,不停地从消息队列头部取出消息对象。如果消息队列中没有消息对象中,Looper处于等待状态,有则取出。Looper调用Handler的handleMessage()方法对消息对象进行处理。
好吧,偷懒截个图吧:

摘自SE02E06的视频
2.SE02E07,Handler(上)讲得是,他打算实现:
- 通过Handler实现线程间通信
- 在主线程中实现Handler的HandleMessage()方法
- 在WorkerThread中通过Handler发送消息
于是他在MainActivity中写了一个NetworkThread extends Thread,在里面的run()方法中他先让线程sleep两秒钟(模拟访问网络),然后定义一个String s,尝试把s赋值给前面定义好的textView中,用「textView.setText(s);」,他提到这样是不行的,因为「只能在UI线程MainThread中操作控件。」而这个线程属于workerThread,操作会报异常,RunThreadException。
解决方法是:
在run()方法中加入:
Message msg = handler.obtainMessage();
msg.obj = s ;
//sendMessage()方法,在主线程或是worker thread中发送都是可以的
handler.sendMessage(msg);
Looper从消息队列中取出之后在主线程中执行。在生成handler对象的Myhadler 中得到String s = (String)msg.obj;。这就实现了在workerThread和MainThread中通信。这时候再更新UI:textView.setText(s);即可。
读取SD卡文件,访问网络,完成复杂运算等等。。需要开辟新线程的操作,可以把结果赋值给msg,用Handler发送出去,然后在主线程中得到msg中的数据,再更新到UI上面。
-----------------Mar.27,2014------------------------
想写却没来的及写,试了下RC4算法。 WHAT DID I DO TODAY!!!!
-----------------May.15,2014------------------------
最近用了handler在不同线程之间传值,发现:
1.handler传值一定是在不同线程之间,否则会报错。
2.handler的handleMessge()方法,会在另一个线程的sendMessage()方法执行之后,也就是消息发出之后,才会自动执行。
3.在Thread是MainActivity的内部类的时候,总是可以的传值的;但是实际应用中把Thread写成了一个单独的java文件FirstThread.java,于是在FirstThread.java中,写了:
Message msg = handler.obtainMessage();
msg.obj = result;
handler.sendMessage(msg);
而在MainActivity的handleMessage方法中想要同样用String s = (String) msg.obj;得到FirstThread中发送的值,可是发现得不到(handleMessage方法不执行,说明队列中没有msg)。不知怎么弄。暂时放弃。
Android中的Handler,以及用Handler延迟执行的更多相关文章
- Android中消息系统模型和Handler Looper
http://www.cnblogs.com/bastard/archive/2012/06/08/2541944.html Android中消息系统模型和Handler Looper 作为Andro ...
- Android中的消息机制:Handler消息传递机制
参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...
- Android中的消息机制:Handler消息传递机制 分类: H1_ANDROID 2013-10-27 22:54 1755人阅读 评论(0) 收藏
参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...
- Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
- 谈谈对Android中的消息机制的理解
Android中的消息机制主要由Handler.MessageQueue.Looper三个类组成,他们的主要作用是 Handler负责发送.处理Message MessageQueue负责维护Mess ...
- Android中AsyncTask使用具体解释
在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...
- 并发编程之Android中AsyncTask使用详解(四)
更多Android高级架构进阶视频免费学习请点击:[https://space.bilibili.com/474380680] 在Android中我们可以通过Thread+Handler实现多线程通信 ...
- C#中Linq延迟执行问题
本文来自:http://msdn.microsoft.com/zh-cn/library/bb399393(v=vs.110).aspx http://www.cnblogs.com/zhanglin ...
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
随机推荐
- PXE+Kickstart 自动安装CentOS系统
PXE (preboot execcute environment) 依赖服务 dhcp tftp file server (yum repository) 准备TFTP服务器 如何配置TFTP服务 ...
- Yii 之视图数据块
控制器代码: public $layout = 'common'; public function actionStudent(){ $data = array('page_name'=>'St ...
- 结构字段验证--validator.v9
官网:https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Baked_In_Validators_and_Tags package va ...
- codevs——2693 上学路线(施工)
2693 上学路线(施工) 时间限制: 2 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 问题描述 你所在的城市街道好像一个 ...
- 字符串哈希hash
题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...
- 7.Java web—tomcat9部署
1)安装 在此之前要安装 好jdk和jre 下载绿色版 http://tomcat.apache.org/ 解压至:D:\Program Files (x86)\tomcat9 环境变更path添加两 ...
- 赵雅智_Swift(2)_swift常量和变量
分号 Swift 并不强制要求你在每条语句的结尾处使用分号(;) 你打算在同一行内写多条独立的语句必需要用分号 let cat = "? ?? ? "; println(cat) ...
- [Testing] Config jest to test Javascript Application -- Part 3
Run Jest Watch Mode by default locally with is-ci-cli In CI, we don’t want to start the tests in wat ...
- vuex 与 redux 的 区别
一:redux和flux的区别 1)redux是flux中的一个实现 2))在redux中我们只能定义一个store,在flux中我们可以定义多个 3)在redux中,store和dispatch都放 ...
- UVA 11246 - K-Multiple Free set(数论推理)
UVA 11246 - K-Multiple Free set 题目链接 题意:一个{1..n}的集合.求一个子集合.使得元素个数最多,而且不存在有两个元素x1 * k = x2,求出最多的元素个数是 ...