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

現在我沒有睡覺,直到任務完成,因爲這是工作的一部分,開始意圖。