Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在应用程序实例中异步初始化对象?_Java_Android - Fatal编程技术网

Java 如何在应用程序实例中异步初始化对象?

Java 如何在应用程序实例中异步初始化对象?,java,android,Java,Android,我有一个消息“服务”(不是Android服务),我想在应用程序的onCreate中初始化它一次,然后向所有应用程序组件提供这个“服务” 问题是MessageBus应该在单独的线程上初始化,因为它执行一些网络操作 如果客户端试图访问MessageBus实例,如何消除竞争条件?比如说,活动试图获取MessageBus,但它仍然没有初始化 public interface ServiceProvider { public MessageBus getMessageBus();

我有一个消息“服务”(不是Android服务),我想在应用程序的onCreate中初始化它一次,然后向所有应用程序组件提供这个“服务”

问题是MessageBus应该在单独的线程上初始化,因为它执行一些网络操作

如果客户端试图访问MessageBus实例,如何消除竞争条件?比如说,活动试图获取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;
    }
}

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

编辑


如果您想通知其他组件安装完成,那么observer模式()应该可以达到这个目的。例如,在您的应用程序对象中,您可以公开方法,如
setOnSetupCompletedListener()
,安装完成后,您可以让所有注册的侦听器都知道。

谢谢,但问题是如何通知ServiceProvider客户端初始化已完成。@您可以通过LocalBroadcastManager发送广播。