Aidl同步数据至给第三方出现异常
问题原因:在调用 beginBroadcast() 之前, 上一个 begin 没有调用 finishBroadcast() 结束, 就会引发异常"beginBroadcast() called while already in a broadcast"
现有两个方法:
void syncDatas(List books)
void syncData(Book book)
分别是把一个书的集合【List】和某一本书【Book】的数据通过Aidl的方式传递给第三方。
由于书集合的数据比较大,当书的集合的数据传到一半时【没有调用 finishBroadcast() 结束】,这时候某一本书的数据也在同步给第三方,这时候就出现异常"beginBroadcast() called while already in a broadcast"了。
private void syncDatas(List<Book> books) {
int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
try {
callbackList.getBroadcastItem(i).onDatasChanged(books);
} catch (Exception e) {
e.printStackTrace();
}
}
callbackList.finishBroadcast();
}
private void syncData(Book book) {
int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
try {
callbackList.getBroadcastItem(i).onDataChanged(book);
} catch (Exception e) {
e.printStackTrace();
}
}
callbackList.finishBroadcast();
}
解决方法:
private Lock mLock =new ReentrantLock();
private void syncDatas(List<Book> books) {
mLock.lock();
try {
int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
callbackList.getBroadcastItem(i).onDatasChanged(books);
}
callbackList.finishBroadcast();
} catch (Exception e) {
e.printStackTrace();
}finally {
mLock.unlock();
}
}
private void syncData(Book book) {
mLock.lock();
try {
int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
callbackList.getBroadcastItem(i).onDataChanged(book);
}
callbackList.finishBroadcast();
} catch (Exception e) {
e.printStackTrace();
}finally {
mLock.unlock();
}
}
这样就能保证上一个 begin 调用 finishBroadcast() 结束后才会进入下一个beginBroadcast();