【问题标题】:Java: stuck in an infinite loopJava:陷入无限循环
【发布时间】:2020-02-09 23:21:49
【问题描述】:

我只想在我的服务完全停止时才做一些事情。

所以我将一个公共静态变量初始化为 false,在 onCreate() 中初始化为 true,在 onDestroy() 中初始化为 false。

在我的活动中:

if(TripService.trip_service_state)
{
   stopService(newIntent(ProfileActivity.this,TripService.class));
   while (TripService.trip_service_state);
   do_stuff();
}

为我服务:

public static boolean trip_service_state=false;

onCreate()
{
    super.onCreate();
    trip_service_state=true;
}

onDestroy()
{
   trip_service_state=false;
   super.onDestroy();
}

现在,当我的服务运行时,应用收到 NOT RESPONDING 消息。

【问题讨论】:

  • 你想让do_stuff();函数在while循环之后还是里面执行?
  • while 循环之后。

标签: java android binary-semaphore


【解决方案1】:

由于ServiceActivity 在同一线程上执行,因此无法执行将标志设置为false 的代码:Activity 方法永远不会停止。这就是您获得 ANR 的原因。

您可以改为通过LocalBroadcastManagerBroadcastService 发送到Activity。 (Activity 必须动态注册和注销相应的BroadcastReceiver

【讨论】:

  • 我可以通过一些简单的方法实现相同的功能吗?
  • @Rajat Aggarwal - 嗯,这简单的方法。关键是您必须放手一个组件(活动),以便另一个组件(服务)有机会完成其工作并在完成后通知相关方。当然,您也可以在 UI 线程之外的其他线程中执行无限循环,但不知何故,我真的不喜欢每隔几毫秒检查一次是否仍然存在的想法——浪费能源。类似于为什么“推”比“拉”更好。或者您可以使用 LiveData。从架构的角度来看更好,但肯定不会更容易
  • 另外一件事:Service.onDestroy() 不能保证被调用
猜你喜欢
  • 2015-07-02
  • 2017-05-19
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多