Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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 Android服务在启动/恢复时短暂为空_Java_Android - Fatal编程技术网

Java Android服务在启动/恢复时短暂为空

Java Android服务在启动/恢复时短暂为空,java,android,Java,Android,我有一个后台服务,可以管理第三方API的发布/订阅 我将服务设置为: public ServiceConnection myServiceConn = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { myService = ((ThirdPartyService.Binder)binder).getSer

我有一个后台服务,可以管理第三方API的发布/订阅

我将服务设置为:

 public ServiceConnection myServiceConn = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder binder) {
            myService = ((ThirdPartyService.Binder)binder).getService();
        }
 }
然后在我的活动onCreate方法中:

Intent intent = new Intent(this, ThirdPartyService.class);
bindService(intent);
当活动加载时,服务最初为空

public void onStart() {
    myService.doSomething();  //is null for a few hundred milliseconds
}
在使用该服务之前,我必须至少延迟500毫秒

问题是,是否有一种回调方法/策略可以用来在服务可用时触发,而不是任意延迟?

是的!只需添加以下内容:

而变量thatisaproblem==null{ /*如果你想安装一个system.out.PrintLn还没有准备好这里的一些东西,那么就这样做,否则就不用麻烦了*/ } 其他代码
当调用OnServiceConnectiond回调时,该服务将可用,此时您可以保证myService变量不为null

在那之后,只需触发使用第三方服务API服务所需的一切。
我还希望在活动中定义myServiceConn。

这将无限地卡在while循环中。也许是等待/通知修改……我猜他的意思是当myService==null;为什么它会被无限地卡住?您说过myService最终会被分配。无论如何,此解决方案都是不好的,因为它试图修复问题的表现形式,而不是问题本身。@m0skit0 while似乎正在阻塞。然而,把它放在一个单独的线程中是可行的。说到你的观点…它理想吗?在我看来,你不应该一直等待一个变量停止为空。如果发生这种情况,您的代码结构就很糟糕,也就是代码气味。请看我对你的问题的评论。这是一个很大的代码气味。你真的不应该在你的活动中有商业逻辑。无论如何,为什么不改为在服务的onstart命令中执行该调用?在启动时工作,但当应用程序被发送到后台然后恢复时,服务仍然连接。因此,onServiceConnected不会再次激发。因为在这个场景中我断开了与API的连接,所以我需要重新连接到API,并且需要可用的服务,这是延迟的。我希望您在进入后台之前解除服务绑定,对吗?不,我只在onDestroy中解除绑定;好的,那么请尝试解除onStop上的服务绑定,并查看在活动恢复时是否调用onServiceConnected回调。希望这有帮助。@Lilbuitch Lino就在这里。您希望在互补点绑定/取消绑定。Android文档推荐使用onStart/onStop。一旦活动离开屏幕,就会调用onStop。如果没有呼叫,则表示您已崩溃。您可以在onServiceConnected和unbindService之间使用MSService引用。