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一般 ...
随机推荐
- awk 对简单文本处理试水
#juanjuan是一个文件 [root@localhost c_test]# cat juanjuan , , bffd97d0 , , bffd97cc , , bffd97c8 , , #-F ...
- Codeforces 487B Strip (ST表+线段树维护DP 或 单调队列优化DP)
题目链接 Strip 题意 把一个数列分成连续的$k$段,要求满足每一段内的元素最大值和最小值的差值不超过$s$, 同时每一段内的元素个数要大于等于$l$, 求$k$的最小值. 考虑$DP$ 设$ ...
- codevs科技庄园
/* 因为每一秒只能走一个单位长度,而每走一个单位长度又会消耗一个体力值,如果体力值没有了时间还有也只能按照体力值计算,反之一样,所以V对于时间和体力值取小 cnt记录有桃子的树的个数,node[cn ...
- cef network-settings
Network Settings 目录 1 System network settings 2 Preference service for network settings 3 Command-li ...
- Java下接口interface前面要不要加I
说明:加I和不加I都可以,看需要,没有强制要求. 在Java中更多是提倡不加I的,可以看下JDK的源码,都是不加I的. 微软C#是规定要加I,这也是影响从而导致有这个话题的原因. Java中特定不直接 ...
- win10中显示wpcap.dll丢失的处理方式
win10中显示wpcap.dll丢失的处理方式 学习了:https://jingyan.baidu.com/article/4f34706e30e673e387b56dd8.html 直接安装Win ...
- ElasticSearch生产模式开发模式的区分
ElasticSearch生产模式开发模式的区分 network.host: 0.0.0.0 如果network.host不是localhost就是生产模式, 开发模式中的warning就是生产模式中 ...
- VisualSVN Server 改动用户password
VisualSVN Server是很方便好用的SVNserver端软件.但有个问题,你在server端创建了usernamepassword后,用户无法自己改动password.据说VisualSVN ...
- 最小公倍数(Least Common Multiple)
最小公倍数=两个数的乘积/两个数的最大公约数. 接上篇求最大公约数方法,最小公倍数的代码例如以下: public class LCM { //最小公倍数=两数乘积/最大公约数 public stati ...
- 不是技术牛人,如何拿到国内IT巨头的Offer--转
http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,N ...