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