2
我想在異步任務中執行一些Firebase查詢。問題是我必須調用Thread.sleep(5000);獲得預期的結果列表。否則,該列表將始終爲空,因爲任務結束時無需等待Firebase查詢的完成。 任務從後臺服務調用,並通過Task.execute()。get();等待結果。完成Firebasequery之前完成的Android異步任務
有沒有可能在不調用Thread.sleep()的情況下獲得異步任務結果?
@Override
protected ArrayList<Product> doInBackground(InventoryCheckService... params) {
this.service = params[0];
result = new ArrayList<>();
DatabaseReference userReference = DatabaseAdapter.getInstance().getUserReference();
if(userReference != null){
userReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
HashMap<String, Product> changedProducts = dataSnapshot.getValue(new GenericTypeIndicator<HashMap<String, Product>>() {
});
if(changedProducts != null){
Iterator<String> iterator = changedProducts.keySet().iterator();
String nextExpirationDate = getDateForTommorow();
while (iterator.hasNext()) {
String nextKey = iterator.next();
Product product = changedProducts.get(nextKey);
if (product.getBestBeforeDate().containsKey(nextExpirationDate)) {
result.add(product);
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return result;
}
在此先感謝您的幫助! :)
爲什麼你在異步任務中執行Firebasequery,我猜所有的firebase查詢都是異步執行的。 –
@KamranAhmedKhan,這個任務由後臺服務調用。這是一個預定的後臺服務(我使用的是Firebase.Jobdispatcher,它擴展了Service)。據我所知UI-Thread在執行服務時被阻塞,所以我把邏輯移到了一個Task中。... [Android IntentService](https://developer.android.com/training/run-background-服務/創建-service.html) – SteelSailor