[英]CountDownLatch in Android locking thread
我剛剛開始在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
回調已成功命中,但是線程掛起了。
UPDATE我剛剛注意到,將CountDownLatch
設置為0時,它將觸發onSuccess
,但是當我將其設置為大於0的任何值時,它將凍結並且永不調用onSuccess
。 似乎線程中有些時髦。
您的代碼太容易出錯,您需要在finally塊中調用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();
}
});
抱歉,您的回答很晚,但是如果仍然對任何人有幫助:
您需要在單獨的線程中執行“ .await”,因為它會阻塞當前線程。
例:
final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
allDoneSignal.await();
mainThreadHandler.post(new Runnable() {
doSomethingWhenAllDone();
});
}
}).start()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.