2
非同期タスクでFirebasequeryを実行します。問題は、私はThread.sleep(5000)を呼び出さなければならないことです。期待される結果リストを得る。それ以外の場合、TaskはFirebasequeryの完了を待つことなく終了するため、Listは常に空です。 タスクは、バックグラウンドサービスから呼び出され、Task.execute()。get();によって結果を待機します。Firebasequeryが完了する前にAndroid非同期タスクが完了しました
Thread.sleep()を呼び出さずにasynch Tasksの結果を得る可能性はありますか?
@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を使用していますが、これはサービスを拡張しています)。私が理解したように、サービスを実行している間にUIスレッドがブロックされているので、ロジックをタスクに移動しました.... [Android IntentService](https://developer.android.com/training/run-background- service/create-service.html) – SteelSailor