zoukankan      html  css  js  c++  java
  • 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)。不知怎么弄。暂时放弃。

  • 相关阅读:
    [Apache commons系列]DBUtils 示例代码
    关于syslog
    Phoenix Tips (1)
    Phoenix 常用函数
    Phoenix 的数据类型
    最简单的Phoenix 访问 HBase例子
    SVNKIT 主要方法
    Linux 集群时钟同步
    Linux 集群时钟同步
    Linux 下定时提交SVN
  • 原文地址:https://www.cnblogs.com/larrylawrence/p/3555709.html
Copyright © 2011-2022 走看看