gpt4 book ai didi

Android IPC : onServiceConnected called, 后跟 NullPointerException

转载 作者:行者123 更新时间:2023-11-30 01:37:17 27 4
gpt4 key购买 nike

我们的应用程序连接到通过 AIDL 接口(interface)公开的 IPC Service。到目前为止一切正常,但突然我们观察到在调用 onServiceConnected 回调后立即抛出 NullPointerException。

我们通过以下方式绑定(bind)到服务:

boolean isServiceBound = context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

然后我们确保服务绑定(bind)成功,后台线程等待 onServiceConnected 回调被调用:

private ServiceConnection serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder binder) {
Log.d(TAG, "converting Binder into IAidlService");

aidlService = IAidlService.Stub.asInterface(binder);

serviceConnected(); // this call releases background thread that waits for connection to be established

}

public void onServiceDisconnected(ComponentName className) {
Log.d(TAG, "IAidlService disconnected unexpectedly");

aidlService = null;
}
};

onServiceConnected 回调调用期间调用 serviceConnected() 后,我们假设连接已建立并且 aidlService 变量已初始化(除非onServiceDisconnected 之后被调用,但这里不是这种情况。

正如我所说,这个方案在一段时间内运行良好,但突然我们遇到了在 onServiceConnected 之后抛出 NullPointerException 的情况。日志输出:

01-21 14:06:32.717 22651-22651/com.xxx.xxx D/LocalService: converting Binder into IAidlService
01-21 14:06:32.721 22651-9574/com.xxx.xxx E/AndroidRuntime: FATAL EXCEPTION: IntentService[LocalService]
01-21 14:06:32.721 22651-9574/com.xxx.xxx E/AndroidRuntime: Process: com.xxx.xxx, PID: 22651
01-21 14:06:32.721 22651-9574/com.xxx.xxx E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'void com.yyy.yyy.IAidlService.someMethod(android.os.Bundle)' on a null object reference

如您所见,aidlService 在主线程上调用 onServiceConnected 后在后台线程中使用。我 99.9% 确信这里没有多线程问题,并且使后台线程等待直到 serviceConnected() 被调用的逻辑工作正常(并且在 logcat 中看到的 4ms 延迟支持这种说法).

我们无法重现此行为。

所以,我们知道 onServiceConnected 被调用了,但是 aidlService 变量没有被初始化。我只看到此行为的一个潜在原因:系统传递给 onServiceConnectedIBinder 对象是 null(我 100% 确信IPC 服务的 onBind() 返回的对象有效)

我在网上找不到关于这种情况的任何信息,因此我的问题是:

  1. 有没有人遇到过类似的行为?
  2. 是否有任何情况下 onServiceConnected 将作为第二个参数传递 null 而不是远程 Service 返回的有效 IBinder ?

最佳答案

感谢@pskink 的帮助,我意识到 onServiceConnected 不能用 null IBinder 调用,AIDL 的 Stub.asInterface 也不能返回 null。

底线:无需在 onServiceConnected 回调中进行 null 检查。

关于Android IPC : onServiceConnected called, 后跟 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34973257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com