【问题标题】:Using Handler inside service在服务内部使用 Handler
【发布时间】:2017-12-28 11:43:30
【问题描述】:

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

service 中调用具有延迟的方法的最佳方法是什么?

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

【问题讨论】:

标签: android


【解决方案1】:

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

【讨论】:

  • "Yes Handler() usefull only on UI thread" 这不是真的 - 它可以与附加 Looper 的任何线程一起使用 - 例如 HandlerThread
  • @Prem 谢谢你,你建议的这段代码将运行一次,还是重复?,我只想运行一次。
【解决方案2】:

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

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
        }
    });

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 你说得对,我已经测试过了,它可以工作,因为当 Handler 在服务中时,它会从服务线程而不是 ui 线程派生,对吗?
    • @Miladranjbar Yes Handler() 仅在 UI 线程上有用,如果你想在普通线程上使用,你需要实现 looper
    【解决方案4】:

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

    您只需对代码稍作修改即可做到这一点,如下所示。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      相关资源
      最近更新 更多