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一般 ...
随机推荐
- LeetCode OJ--Valid Palindrome
http://oj.leetcode.com/problems/valid-palindrome/ 判断是否为回文串 bool isPalindrome(string s) { ,j = s.leng ...
- es6 递归 tree
function loop(data) { let office = data.map(item => { if(item.type == '1' ||item.type == '2') { i ...
- android apk程序升级
1 .设置apk版本号 Androidmanifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/ ...
- vue之组件注册
一.组件名 写组件之前你要明确你的目的,想要做一个什么样的组件,我们在注册一个组件的时候,需要给组件一个名字,对于命名,尽可能明确,使用 kebab-case (短横线分隔命名) 或 PascalCa ...
- IOS常见错误分析解决(一直更新) 你值得收藏-综合贴
-来自收藏总结 综合了好多的常见错误 1:clang failed with exit code 254 一:检測代码中 是否 有 NSLog 打印了 返回 void 的值. 2:Verify exi ...
- stl之multiset容器的应用
与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,仅仅是multiset容器同意将反复的元素健值插入.而set容器则不同意. set容器所使用的C++标准头文件set.事实上 ...
- 【java】itoo项目实战之hibernate 批量保存优化
在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情 ...
- 第六十题(在O(1)时间内删除链表结点)
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.
- C++类中使用new及delete小例子
//默认复制构造函数的不足//尽管有默认的复制构造函数来解决一般对象与对象之间的初始化问题, 但是在有些情况下我们必须手动显式的去定义复制构造函数, 例如: #include <iostream ...
- 文件宝局域网传输/播放功能使用帮助(Mac电脑用户)
使用局域网账户密码登录,可以访问电脑上所有文件 使用游客无账户密码登录,只能访问电脑上指定共享文件夹的文件. 怎么设置共享文件夹请参考: 1.打开“共享”偏好设置(选取苹果菜单 >“系统偏好设置 ...