我刚刚开始在我的 Android 应用程序中使用 CountDownLatch
。目前我正在尝试向我的 api 发出两个 Volley
请求,并等待数据被检索并存储后再继续执行线程。
这是我的代码示例:
// new CountDownLatch for 2 requests
final CountDownLatch allDoneSignal = new CountDownLatch(2);
transactions.getResourcesForRealm(Contact.class, "", new ICallBack<Contact>() {
@Override
public void onSuccess(ArrayList<Contact> resources, String resourceId) {
transactions.createRealmObject(resources, Contact.class);
allDoneSignal.countDown();
}
@Override
public void onFail(ArrayList<Contact> resources) {
}
});
transactions.getResourcesForRealm(Meeting.class, "", new ICallBack<Meeting>() {
@Override
public void onSuccess(ArrayList<Meeting> resources, String resourceId) {
transactions.createRealmObject(resources, Meeting.class);
allDoneSignal.countDown();
}
@Override
public void onFail(ArrayList<Meeting> resources) {
}
});
try {
allDoneSignal.await();
// continue executing code
// ...
} catch (InterruptedException e) {
e.printStackTrace();
}
问题是它似乎没有“完成”倒计时并因此卡住,因为闩锁从未被释放。我已确认 API 请求正在运行并且 onSuccess
回调已成功命中,但线程挂起。
更新
我刚刚注意到当 CountDownLatch
设置为 0 时,它触发 onSuccess
,但是当我将它设置为任何大于 0 的值时,它会卡住并且 onSuccess
永远不会被调用。线程似乎有些古怪。
最佳答案
您的代码太容易出错,您需要在 finally block 中调用 countDown()
并在 onFail
中调用它,否则如果失败,您的应用程序将卡住永远。所以你的代码应该是这样的:
transactions.getResourcesForRealm(Contact.class, "", new ICallBack<Contact>() {
@Override
public void onSuccess(ArrayList<Contact> resources, String resourceId) {
try {
transactions.createRealmObject(resources, Contact.class);
} finally {
allDoneSignal.countDown();
}
}
@Override
public void onFail(ArrayList<Contact> resources) {
allDoneSignal.countDown();
}
});
transactions.getResourcesForRealm(Meeting.class, "", new ICallBack<Meeting>() {
@Override
public void onSuccess(ArrayList<Meeting> resources, String resourceId) {
try {
transactions.createRealmObject(resources, Meeting.class);
} finally {
allDoneSignal.countDown();
}
}
@Override
public void onFail(ArrayList<Meeting> resources) {
allDoneSignal.countDown();
}
});
关于java - Android锁定线程中的CountDownLatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38694614/