2014-01-28 22 views
1

在我的IntentService类的onHandleIntent中,我创建了包含应在20秒后完成的runnable的句柄。不幸的是,我的服务睡眠或在这段时间之前被摧毁。 我也尝试过CountDownTimer,但我有同样的问题。 有人有任何想法可以让onHnadleIntent等待吗?谢谢!使IntentService不会睡眠,直到它执行handler.postDelayed可运行

这是代码:

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

回答

4

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

+1

非常感谢。 –

+0

谢谢lottttttt !!! – prasanthMurugan

+0

这是相同的问题,对吗? https://stackoverflow.com/questions/36949239/handler-postdelayed-is-not-working-in-onhandleintent-method-of-intentservice 为什么,你知道吗?基本上,我的应用程序仍处于前台,屏幕仍在运行,但仍然无法工作......当IntentService可用时,为网络任务创建新的HandlerThread听起来像是过度杀伤,除非有一个坚实的理由。 Pls ... –

1

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

注意:这将导致intent服务不处理您发送它的其他Intents,直到前一个完成(20秒后)。

您可能还想在onHandleIntent开始时获得部分唤醒锁,并在最后释放它。

+0

谢谢你的回应!我不知道它是否适用于我,我没有尝试。我希望它能帮助另一个人。 –