在我的应用程序中,类的单个实例就像一个状态机。许多活动想要接收有关此对象状态的更新。该对象本身的状态是从一些原始信息的广播数据中更新的。
我已经用这种方式实现了它。 我在清单文件中注册了一个广播接收器,它接收原始信息,然后启动一个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);
}
}
我想知道是否有更优雅的方式来实现这一目标。我想知道是否应该尝试避免启动IntentService(反过来将启动一个单独的线程)。原始广播每秒发送大约10次。
让我们说statemachine.update需要花费很多时间才能到达下一个广播,我想忽略那些广播。这样做的最佳方式是什么?
答案 0 :(得分:1)
如果你有一个需要对其成员进行序列化访问的单例对象,一种方法是使用HandlerThread并从接收者或其他任何工作可能来源安排传入的工作。 HandlerThread将按接收顺序处理所有内容(可运行或消息)(就像Android主线程一样)。
如果您想跳过传入的工作项,您可以记录工作的接收时间并将其与实际执行时间进行比较,如果超出某个阈值,则跳过它。
答案 1 :(得分:0)
在1 GHz手机上启动IntentService需要1-15 ms。因为它是在UI上创建的,所以线程10调用甚至可能需要100毫秒,这太多了(用户将遇到延迟)。您应该考虑将Hanlder与WorkerThread一起使用。您可以检查IntentService如何使用此解决方案并在您的案例中实现它。