Android中的Handler,以及用Handler延迟执行
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.」
参考:
---------------------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)。
不知怎么弄。
暂时放弃。