在我的应用程序中,类的单个实例就像状态机一样。许多活动都希望接收有关此对象状态的更新。此对象本身的状态是从某些原始信息的广播数据更新的。
我以这种方式实现它。我在清单文件中注册了一个广播接收器,该文件接收原始信息,然后启动一个 IntentService 只是传递接收到的信息。
@Override
public void onReceive(Context context, Intent intent) {
Intent update_service = new Intent(context, StateMachineUpdateService.class);
update_service.putExtra(PRIMITIVE, intent.getDoubleExtra(PRIMITIVE, 0));
context.startService(update_service);
}
StateMachineUpdateService 保留一个实例并更新它:
@Override
protected void onHandleIntent(Intent intent) {
statemachine.update(intent.getDoubleExtra(PRIMITIVE, 0));
Intent broadcast = new Intent(STATE_MACHINE_UPDATE);
broadcast.putExtra(STATE_MACHINE_STATE, statemachine.get_state());
this.sendBroadcast(broadcast);
}
}
我想知道是否有更优雅的方式来实现这一目标。我想知道启动意图服务(反过来将启动一个单独的线程)是否是我应该尽量避免的事情。基元广播在一秒钟内发送大约 10 次。
附带问题:
假设Statemachine.Update花费了太多时间,以至于下一次广播已经到来,我想忽略这些广播。最好的方法是什么?
如果你有一个需要对其成员进行序列化访问的单一实例对象,一种方法是使用 HandlerThread 并计划来自接收器或其他任何可能产生工作的地方对其的传入工作。 HandlerThread 将按照接收的顺序处理所有内容(可运行或消息)(就像 Android 主线程一样)。
如果要跳过传入的工作项,可以记录工作的接收时间,并将其与实际执行时间进行比较,如果超过某个阈值,则跳过它。
启动意图服务在我的 1 GHz 手机上需要 1-15 毫秒。由于它是在 UI 线程 10 上创建的,因此调用甚至可能需要 100 毫秒,这太多了(用户会遇到延迟)。您应该考虑将Hanlder与WorkerThread一起使用。您可以检查 IntentService 如何使用此解决方案并在您的案例中实现它。