Android 异步任务在 Firebasequery 完成之前完成
Android asynchronous Task finishes before Firebasequery completed
我想在异步任务中执行一些 Firebasequery。问题是我必须打电话给 Thread.sleep(5000);获得预期的结果列表。否则列表总是空的,因为任务没有等待 Firebase 查询完成就结束了。
该任务从后台服务调用并通过 Task.execute().get();
等待结果
是否有可能在不调用 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;
}
在此先感谢您的帮助! :)
终于解决了我的问题。我想在任务执行后提出一个意图。我没有从服务启动 Intent,而是将代码放入异步任务中:
@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);
}
}
// start Intent here...
}
现在我不必在 Task 完成之前睡觉,因为它是启动 Intent 的 Task 的一部分。
我想在异步任务中执行一些 Firebasequery。问题是我必须打电话给 Thread.sleep(5000);获得预期的结果列表。否则列表总是空的,因为任务没有等待 Firebase 查询完成就结束了。 该任务从后台服务调用并通过 Task.execute().get();
等待结果是否有可能在不调用 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;
}
在此先感谢您的帮助! :)
终于解决了我的问题。我想在任务执行后提出一个意图。我没有从服务启动 Intent,而是将代码放入异步任务中:
@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);
}
}
// start Intent here...
}
现在我不必在 Task 完成之前睡觉,因为它是启动 Intent 的 Task 的一部分。