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; 
} 

在此先感谢您的帮助! :)

+0

为什么你在异步任务中执行Firebasequery,我猜所有的firebase查询都是异步执行的。 –

+0

@KamranAhmedKhan,这个任务由后台服务调用。这是一个预定的后台服务(我使用的是Firebase.Jobdispatcher,它扩展了Service)。据我所知UI-Thread在执行服务时被阻塞,所以我把逻辑移到了一个Task中。... [Android IntentService](https://developer.android.com/training/run-background-服务/创建-service.html) – SteelSailor

回答

0

最后我解决了我的问题。我想在任务执行后提出一个意图。相反,开始从服务的意向,我习惯把代码到异步任务:

@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... 
      } 

现在我没有睡觉,直到任务完成,因为这是工作的一部分,开始意图。