在服务中使用Handler

时间:2017-12-28 11:43:30

标签: android

我可以在服务中使用此代码来调用延迟方法,或Handler()只能在UI线程中使用吗?

service内调用延迟方法的最佳方法是什么?

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 10000ms
    socket.emit("CancelTravel");
  }
}, 10000);

4 个答案:

答案 0 :(得分:3)

  

Handler()只能在UI线程中使用?

Handler() 仅在UI主题上有用,如果您想在普通主题上使用,则需要实施looper

示例代码

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do something after 10000ms
            socket.emit("CancelTravel");

        }
    }, 5000);

您也可以使用Timer

  

线程的工具,用于在后台线程中安排将来执行的任务。任务可以安排为一次性执行,也可以定期重复执行。

示例代码

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        //Do something after 10000ms
    socket.emit("CancelTravel");       
    }
}, 10000);
  

在服务中调用延迟方法的首选方法是什么?

阅读Timertask or Handler

答案 1 :(得分:1)

您可以在服务中使用延迟:

private Handler handler = null;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    ...
    handler = new Handler();
    ...
}

...

    // from inside your child thread
    handler.post(new Runnable() {
        @Override
        public void run() {
           //your code goes here
        }
    });

答案 2 :(得分:1)

//此代码可用于设置延迟10秒。是的,可以使用

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 10000ms
    socket.emit("CancelTravel");
  }
}, 10000);

答案 3 :(得分:0)

你可以确保你已经在主线程上使用了处理程序实例,这样你就可以在主线程上运行post()runnable。

只需对代码进行一些修改即可实现,如下所示。

final Handler handler = new Handler(Looper.getMainLooper());