Android 如何知道所有服务何时准备就绪

Android 如何知道所有服务何时准备就绪,android,android-activity,android-service,aidl,Android,Android Activity,Android Service,Aidl,目前,我在Android中有一个活动,在onCreate()中,我有一个函数,用于创建我拥有的所有可用MyServices的列表(使用aidl),并在Arraylist中插入名称等 仍然在onStart()中的活动中,我绑定所有服务并使用实现ServiceConnection的单独类连接到它们 在调用onStart()和onRestoreInstanceState(Bundle)之后启动的onPostCreate()中,我立即(自动)向扩展AsyncTask的类提交一个searchquery。当

目前,我在Android中有一个活动,在onCreate()中,我有一个函数,用于创建我拥有的所有可用MyServices的列表(使用aidl),并在Arraylist中插入名称等

仍然在onStart()中的活动中,我绑定所有服务并使用实现ServiceConnection的单独类连接到它们

在调用onStart()和onRestoreInstanceState(Bundle)之后启动的onPostCreate()中,我立即(自动)向扩展AsyncTask的类提交一个searchquery。当连接到处理searchquery的服务之一时,该服务此时不可用,在应用程序启动的几秒钟内,servicelist始终为空

当附加调试器时,服务总是加载的,我似乎无法解决这个问题


因此,我的问题是,当所有服务都已加载或准备好接受查询时,我可以使用什么方法获得通知?

实际上,没有特殊的单一方法可以通知您所有服务连接事件。但是,我希望您在绑定到服务时使用的是
ServiceConnection.onServiceConnected()
。在类中引入一个新方法
waitForConnectingAllServices()
,它将
等待()
,直到有人通知他。您可以使用ServiceConnection类中的方法。保留一个静态变量,该变量将计算它已连接到多少个服务。每当它连接到所有必需的服务时,它都会通知正在等待这种情况发生的函数。

我已经通过在
onPostCreate()中使用
Thread.sleep()
解决了以下代码的问题
然后通过检查服务的大小来检查5次是否加载了我的服务
Arraylist
不是0

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    initDrawer();
    int count = 0;
    boolean mServicesReady = false;
    boolean mPluginAvailable = false;
    //to load the plugin correctly we have to let the thread sleep for 3 seconds
    do {
        if(count == 0){
            try{
                Thread.sleep(3000);
            }catch(InterruptedException e){
                Log.e(TAG, e.getMessage());
            }
        }
        if(services.size() > 0){
            mServicesReady = true;
            //do something more
        }else if(services.size() == 0){
            //there are no services, throw a dialog that there are no services available
            mServicesReady = false;
            if(!mPluginAvailable)
            noPluginAvailable();

            mPluginAvailable = true;
        }

        count++;
    }while((!mServicesReady) && (count < 5));

    mDrawerToggle.syncState();
}
@覆盖
后期创建时受保护的空(捆绑包savedInstanceState){
super.onPostCreate(savedInstanceState);
//在onRestoreInstanceState发生后同步切换状态。
initDrawer();
整数计数=0;
布尔值mServicesReady=false;
布尔值mPluginAvailable=false;
//要正确加载插件,我们必须让线程休眠3秒钟
做{
如果(计数=0){
试一试{
睡眠(3000);
}捕捉(中断异常e){
Log.e(标记,e.getMessage());
}
}
if(services.size()>0){
mServicesReady=true;
//多做点什么
}else if(services.size()==0){
//没有服务,抛出一个没有可用服务的对话框
mServicesReady=false;
如果(!mPluginAvailable)
noPluginAvailable();
mPluginAvailable=true;
}
计数++;
}而((!mServicesReady)和(&(count<5));
mDrawerToggle.syncState();
}

您好,谢谢您的回答,但我使用了另一种解决方案,请参阅下面的帖子。我建议使用等待通知协议,这对于此类任务更为可取。您使用了睡眠-唤醒检查,如果它符合您的目的,那就很好:)