【问题标题】:make an IntentService not sleep until it executes a handler.postDelayed runnable使 IntentService 在执行 handler.postDelayed 可运行之前不休眠
【发布时间】:2014-01-28 13:40:35
【问题描述】:

在我的 IntentService 类的 onHandleIntent 中,我创建了一个包含可运行对象的句柄,该句柄应在 20 秒后完成。不幸的是,我的服务在此期间之前休眠或被破坏。 我也尝试过使用 CountDownTimer,但我遇到了同样的问题。 有人知道我可以让 onHnadleIntent 等待吗?谢谢!

这是代码:

 public class MyService extends IntentService {
    //...
    @Override
    protected void onHandleIntent(Intent workIntent) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i("20 seconds later","I am here");
            }
        }, 20000);
        //...
   }
   //...
}

【问题讨论】:

    标签: android multithreading intentservice postdelayed


    【解决方案1】:

    不要使用IntentService。它不是为您的场景设计的。使用普通的Service。将您的代码放入onStartCommand()。在run() 方法的底部,调用stopSelf() 实例上的stopSelf() 以将其关闭。

    【讨论】:

    • 这是同一个问题,对吗? stackoverflow.com/questions/36949239/… 为什么,你知道吗?基本上,我的应用程序仍处于前台,屏幕仍处于打开状态,但这仍然不起作用......当 IntentService 可用时为网络任务创建一个新的 HandlerThread 听起来有点矫枉过正,除非有充分的理由。请...
    • @AA_PV: HandlerThreadIntentService 轻得多。
    【解决方案2】:

    您需要阻止 onHandleIntent 返回,直到 Runnable 完成。这可以通过使用 CountdownLatch 来实现,它在 onHandleIntent 方法结束时等待,并在 run 方法结束时释放。

    注意:这将导致 Intent 服务在前一个 Intent 完成之前(20 秒后)不会处理您发送的其他 Intent。

    您可能还想在 onHandleIntent 开始时获取部分唤醒锁并在结束时释放它。

    【讨论】:

    • 感谢您的回复!我不知道它是否适合我,我没有尝试过。我希望它可以帮助另一个人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2023-03-30
    • 1970-01-01
    • 2016-07-31
    • 2018-08-21
    • 2013-01-23
    相关资源
    最近更新 更多