beginBroadcast java.lang.IllegalStateException
已知在 aidl 中回调注册的 callback 对象时, 需要使用 beginBroadcast() 和 finishBroadcast(), 且一个 begin 之后对应一个 finish;
下面是官方建议的回调的写法;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int i = callbacks.beginBroadcast(); while (i > 0) { i--; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take care of removing // the dead object for us. } } callbacks.finishBroadcast(); |
如果在调用 beginBroadcast() 之前, 上一个 begin 没有调用 finishBroadcast() 来结束传播, 就会引发异常"beginBroadcast() called while already in a broadcast"
这次遇到 "callbacks.getBroadcastItem(i).somethingHappened()" 时发生 "java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast" 异常
一开始以为是 getBroadcastItem() 发生了异常, 查看源码发现不可能是这个方法产生异常; 再将 "callbacks.getBroadcastItem(i).somethingHappened()" 分成两个语句, 发现是 somethingHappened() 这个回调引发了异常;
查看其它应用对 callback 中回调方法的处理, 发现是某一个应用的注册回调, 在方法中调用了 beginBroadcast() 但是没有调用 finishBroadcast(); 结果触发了 IllegalStateException 异常, 经由 Parcel 的 readException() 转发到了 Service 端;
0 Comments