如何异步在Application实例中初始化我的对象?

时间:2014-04-24 08:22:37

标签: java android

我有一个消息“服务”(不是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;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以向应用添加启动画面活动(或在对话框中显示进度条或以任何其他方式锁定您的应用),只要所有应用元素都已完全初始化,就可以将其保持可见状态。向用户显示任何内容(特别是如果init操作可能需要一段时间)非常重要,因为它向用户提供某种反馈,即应用程序实际上正在做某事。

修改

如果要通知其他组件设置已完成,则观察者模式(wiki)应该用于此目的。即在您的Application对象中,您的公开方法如setOnSetupCompletedListener(),当您的设置完成后,您将让所有已注册的听众知道。