【发布时间】:2016-08-01 08:52:09
【问题描述】:
我刚刚开始在我的 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。线程似乎很时髦。
【问题讨论】:
-
我可能错了,但对于线程和值相关的问题,请检查
Volatile variable概念。 -
这应该可以按预期工作 - 您可以在调用 countDown 之前记录一些内容以确保确实调用了该方法吗?
-
@PradeepKumarKushwaha 这里不需要 volatile,latch 已经提供了足够的同步保证。
-
我会尝试
Log.wtf这个... -
您还说“2 个请求的新倒计时” - 可能会仔细检查三个位置的
allDoneSignal变量是否相同(如果代码与您在单个方法中发布的完全一样,那么它显然是)...
标签: java android multithreading android-volley countdownlatch