【问题标题】:onReceive maximum thread sleeponReceive 最大线程睡眠
【发布时间】:2015-07-20 16:54:41
【问题描述】:

对于一个 android 应用程序,我需要在 onReceive 方法启动后休眠。

通过实验,我发现我可以在

(是的,我知道我不应该在 UI 线程中执行此操作,它不是 UI 线程)。

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

【问题讨论】:

  • read BroadcastReceiver docs: "BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效。一旦您的代码从此函数返回,系统会考虑对象要完成并且不再处于活动状态。这对您在 onReceive(Context, Intent) 实现中可以执行的操作有重要影响:任何需要 异步 操作的操作都是不可用 ,因为您需要从函数返回来处理异步操作,但此时 BroadcastReceiver 不再处于活动状态,因此系统..."

标签: java android


【解决方案1】:

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

public void onReceive(...

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

【讨论】:

    【解决方案2】:

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

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

    文档推荐

    对于运行时间较长的操作,您经常将 Service 与 BroadcastReceiver 结合使用,以在整个操作期间保持包含进程的活动

    如果你确实实现了一项服务,你可以使用 Timer 来实现 30 秒的延迟。

    【讨论】:

    • 是的,您不能使用 onReceive() 中的 Timer,但如果他需要在 30 秒后运行任务,他仍应在实现中使用 Timer 对象。
    • 不,因为从onReceive返回后,该进程很容易被系统杀死
    • 我在之前的评论中表示同意。
    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2012-08-08
    • 2014-05-15
    相关资源
    最近更新 更多