我有一个消息“服务”(不是Android服务),我想在Applicaion的onCreate中初始化一次,然后向所有app组件提供这个“服务”。
问题是MessageBus应该在单独的线程上初始化,因为它会执行一些网络操作。
如果客户端尝试访问MessageBus实例,如何消除竞争条件?说,Activity尝试获取MessageBus,但它仍未初始化?
public interface ServiceProvider {
public MessageBus getMessageBus();
}
public class MyApplication extends Application implements ServiceProvider {
private MessageBus messageBus;
@Override
public void onCreate(){
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
try {
messageBus = new MessageBusImpl();
} catch (Exception e) {
Log.d(TAG, "Failed to init MessageBus");
e.printStackTrace();
}
}
}).start();
}
Override
public MessageBus getMessageBus() {
return messageBus;
}
}
答案 0 :(得分:1)
您可以向应用添加启动画面活动(或在对话框中显示进度条或以任何其他方式锁定您的应用),只要所有应用元素都已完全初始化,就可以将其保持可见状态。向用户显示任何内容(特别是如果init操作可能需要一段时间)非常重要,因为它向用户提供某种反馈,即应用程序实际上正在做某事。
修改强>
如果要通知其他组件设置已完成,则观察者模式(wiki)应该用于此目的。即在您的Application对象中,您的公开方法如setOnSetupCompletedListener()
,当您的设置完成后,您将让所有已注册的听众知道。