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一般 ...
随机推荐
- [转发]Android 系统稳定性 - ANR(二)
文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任. 很久之前写的了,留着有点浪费,共享之.编写者:李文栋P.S. OpenOffice粘贴过来后格式有些混乱. http://rayleeya ...
- css,世界上没有绝对简单的事情
引文 自从学了前端的基础,自认为是没什么css是能难倒我的,可是事实是,世界上没有绝对简单的事情,实际上还有好多的东西等待我们去发掘. 详解 1.有些浏览器不完全支持css3,现在可以用 modern ...
- 从Activity的启动流程理解Binder
简述 关于Activity启动流程和Binder的文章很多,大多数是分开来讲的,本文将二者结合起来,着重分析启动流程中跨进程方面的细节,其实,启动流程看似调用繁多,主要是复杂在Activity栈管理等 ...
- 《流畅的Python》一副扑克牌中的难点
1.现在在看<流畅的Python>这本书,看了三页就发现,这本书果然不是让新手来入门的,一些很常见的知识点能被这个作者玩出花来, 唉,我就在想,下面要分析的这些的代码,就算我费劲巴拉的看懂 ...
- android 获得屏幕状态
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- weblogic内存调整说明
一:WebLogic配置问题: 由于WebLogic的配置问题,我们的测试出现了失败情况.原因是为WebLogic分配的内存太少了.通过修改commom\bin\commEnv.cmd文件来增加内存 ...
- Go -- type 和断言 interface{}转换
摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...
- 机器学习优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
SGD: 此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mi ...
- NHibernate之旅(7):初探NHibernate中的并发控制
本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 ...
- Python——正則表達式(2)
本文译自官方文档:Regular Expression HOWTO 參考文章:Python--正則表達式(1) 全文下载 :Python正則表達式基础 ======================== ...