Android 如何等待IntentService完成其任务

Android 如何等待IntentService完成其任务,android,rest,intentservice,android-internet,android-async-http,Android,Rest,Intentservice,Android Internet,Android Async Http,我正在使用intent服务与服务器通信,以获取应用程序的数据。我希望应用程序在尝试访问或使用数据要存储的变量之前,等待它请求的数据被发回(希望意味着请求数据的IntentService已经运行完毕)。我该怎么做呢?谢谢 最简单的方法是让您的IntentService在完成从服务器收集数据后发送广播,您可以在UI线程中收听(例如活动) 然后创建广播接收器(活动中的单独类或内部类) 例如 现在,最后一步是在活动中注册BroadcastReceiver: IntentFilter statusInte

我正在使用intent服务与服务器通信,以获取应用程序的数据。我希望应用程序在尝试访问或使用数据要存储的变量之前,等待它请求的数据被发回(希望意味着请求数据的IntentService已经运行完毕)。我该怎么做呢?谢谢

最简单的方法是让您的
IntentService
在完成从服务器收集数据后发送
广播
,您可以在UI线程中收听(例如
活动

然后创建广播接收器(活动中的单独类或内部类)

例如

现在,最后一步是在活动中注册BroadcastReceiver:

IntentFilter statusIntentFilter = new IntentFilter(
      Constants.BROADCAST_ACTION);
MyResponseReceiver responseReceiver =
      new MyResponseReceiver();
// Registers the MyResponseReceiver and its intent filters
LocalBroadcastManager.getInstance(this).registerReceiver(
      responseReceiver, statusIntentFilter );

“我想让应用程序等待”--请更具体一些。什么是“应用程序”?你所说的“在应用程序尝试访问或使用数据变量之前”是什么意思?我希望它在intent服务发出http请求时不要做任何事情(我所说的与服务器通信)。然后,一旦该请求返回,执行该操作,该操作是我希望对数据执行的许多不同的处理步骤。应用程序,指的是我正在开发的应用程序,它使用意向服务与服务器通信(发出http请求)。“我喜欢它”--什么是“它”?请发布“it”的源代码,或者至少说出具体的安卓类“it”是什么。我们无法知道“它”是什么。我们所知道的是,“it”不是
IntentService
,顺便说一下,你在构建句子,但这并不是很重要。“意思是我正在开发的应用”——这是一个循环定义。Android开发者编写活动、服务、内容提供商、广播接收器以及这些组件使用的东西。关于这些安卓架构,“它”和“应用程序”是什么?它就是应用程序。我正在开发的应用程序,这就是我问这个问题的原因。使用意向服务发出http请求的应用程序。我要处理从这些http请求返回的数据的应用程序。我只想知道,当通过intent服务发出的http请求完成并返回数据时,如何通知应用程序,并且在返回数据之前,应用程序不会执行任何操作。好的,回答很好,是的。但不是我想要的。我已经执行了上面的所有操作,但是,现在,考虑到我已经执行了这些操作,让我们假设我将一个返回字符串的意图交给我的IntentService,然后在发送该意图后的某个时刻,我调用生成的字符串。如果我没有等待,我可能会在填充该字符串之前、在返回意图之前调用该字符串。特别是在我的例子中,我从广播接收器获取字符串。如果我在接收器收到广播之前调用它,则会出现空指针异常。最好执行空检查并通知用户重试该操作(因为唯一可能发生的方法是用户首先启动该事件序列!),或者应用程序跟踪该状态(即用户希望执行该操作)并在从服务器接收到字符串后自动执行。最好保留一个状态变量并适当地处理这些场景,除非您想在后台任务执行时阻止UI。使用AsycTask显示微调器对话框,直到从服务器接收到所需的数据)执行后台任务时,基本上有三个选项:1。在后台操作完成之前,阻止整个UI并阻止用户进行操作。2.在后台操作完成之前,仅阻止UI中的某些元素(需要非常小心状态转换和导航到其他活动/片段)。3.让用户做任何事情,但如果用户试图做一些不可能的事情(例如,尝试做一些在字符串可用之前使用您所说的字符串的事情),请向用户提供适当的反馈。因此,您所做的第二个评论。如何跟踪“国家”?这听起来正是我想要做的。保留一个布尔值(例如isInvokingService),在调用服务操作之前将其设置为true。然后在MyResponseReceiver中将其设置回false(使其成为一个匿名类以简化操作)。
// Broadcast receiver for receiving status updates from the IntentService
private class MyResponseReceiver extends BroadcastReceiver {
    // Called when the BroadcastReceiver gets an Intent it's registered to receive
    @
    public void onReceive(Context context, Intent intent) {
        ...
        /*
         * You get notified here when your IntentService is done
         * obtaining data form the server!
         */
        ...
    }
}
IntentFilter statusIntentFilter = new IntentFilter(
      Constants.BROADCAST_ACTION);
MyResponseReceiver responseReceiver =
      new MyResponseReceiver();
// Registers the MyResponseReceiver and its intent filters
LocalBroadcastManager.getInstance(this).registerReceiver(
      responseReceiver, statusIntentFilter );