2015-07-20 197 views
0

对于android应用程序,我需要在onReceive方法启动后进入睡眠状态。onReceive最大线程睡眠

通过实验,我发现我可以做一个Thread.sleep为< 20秒。但是,我需要睡30秒以上。一次接一次地睡觉不会有帮助(六次5秒钟睡眠)。

(是的,我知道我不应该在UI线程中这样做,它不是UI线程)。

关于为什么onreceive有最大的Thread.sleep以及如何解决这个问题的任何想法?

+0

阅读'BroadcastReceiver'文档:*“一个BroadcastReceiver对象仅适用于呼叫的持续时间的onReceive(上下文,意图)。一旦这个函数代码返回时,系统考虑的对象这会对onreceive(Context,Intent)实现中的作用产生重要影响:任何需要** asynchronous **操作的操作都是**不可用**,因为您需要从处理异步操作的功能,但此时BroadcastReceiver不再处于活动状态,因此系统是...“* – pskink

回答

0

对于调度未来事件,最好使用Timer而不是Thread.sleep()。您不能使用onReceive()中的Timer(或任何异步调用),因为该过程在onReceive()返回后终止。

正如@pskink提到的,BroadcastReceivers只能用于短期任务。也许你可以发布一些你的设计和你想做的事情,这样我们可以更好地帮助你。

该文档建议

更长的运行操作,你会经常一起使用的服务以及广播接收器,以保持包含过程积极为您的操作

的整个时间如果做一个服务,你可以使用Timer来实现30秒的延迟。

+0

所以它基本上意味着您不能使用定时器... – pskink

+0

是的,您不能使用来自onReceive()的Timer,但他仍然应该在他的实现中使用Timer对象如果他需要在30秒后运行任务。 – Samuel

+0

不,自从'onReceive'返回后,该过程很容易被系统杀死。 – pskink

0

您可以在onReceive中使用view.postDelyed。例如

public void onReceive(... 

    mainView.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     setListRecipients(savedInstanceState.getStringArrayList(RECIPIENTS)); 
    } 
    }, POST_DELAYED_TIME_IN_MILLISECONDS);