[ANDROID]在HandlerThread中实现消息延迟

时间:2014-04-09 12:41:36

标签: android android-asynctask

我想在我的应用中每隔几秒做一些事情,为此,我实施了HandlerThread& handler通过以下代码

handlerThread = new HandlerThread(getClass().getSimpleName());
        handlerThread.start();

    handler = new Handler(handlerThread.getLooper(), new Callback() {

        @Override
        public boolean handleMessage(Message msg) {

            //my code here  
            return l.this.handleMessage(msg);
        }
    });

我通过发送来自onCreate()

的消息来启动此处理程序

我按如下方式处理消息:

private boolean handleMessage(Message msg) {
    switch (msg.what) {
        default:
            return false;
        case MY_MESSAGE:
            if(handler_stop==0)
            {
                checkLauncher();
                sendMessage(MY_MESSAGE); // I Send the message from here to make //this continuous       
            }



    }

    return true;
}

它工作正常,但它发送的信息太快,我的意思是不断,而是我希望这个消息在2或3秒后发送,简而言之,我想每2-3秒重复一次任务。

我如何在上面的代码上执行此操作?请一些帮助

3 个答案:

答案 0 :(得分:9)

首先为Handler声明一个全局变量,以便从Thread更新UI控件,如下所示:

Handler mHandler = new Handler();

现在创建一个Thread并使用while循环来定期使用线程的sleep方法执行任务。

new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                try {
                    Thread.sleep(10000);// change the time according to your need
                    mHandler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            // Write your code here to update the UI.
                        }
                    });
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        }
    }).start();

否则只需在代码中添加:

handler.postDelayed(new Runnable(){
        public void run() {
          // do something             
      }}, 20000);

答案 1 :(得分:1)

为什么不使用Handler.sendMessageDelayed?它允许您安排将消息传递给处理程序,并指定延迟。所以你的代码看起来像这样:

private boolean handleMessage(Message msg) {
    switch (msg.what) {
        default:
            return false;
        case MY_MESSAGE:
            if(handler_stop == 0) {
                checkLauncher();
                sendMessageDelayed(MY_MESSAGE, 2000); // Send message everytime with 2 seconds delay
            }
    }
    return true;
}

答案 2 :(得分:0)

嗨,我有一个简单的方法来做到这一点 试试这个

Runnable runnable;

final Handler handler = new Handler();
    runnable = new Runnable() {

        public void run() {

            // HERE I AM CHANGING BACKGROUND YOU CAN DO WHATEVER YOU WANT
            _images[i].setBackgroundResource(imageArray[0]);
            i++;

            handler.postDelayed(this, 1000); // for interval...
        }
    };
    handler.postDelayed(runnable, 1000); // for initial delay..

为我工作希望你也会发现它有效

感谢

如果找到有用的话,

投票