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)。不知怎么弄。暂时放弃。

原文地址:https://www.cnblogs.com/larrylawrence/p/3555709.html