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

ありがとうございました! :)

+0

なぜ非同期タスクでFirebasequeryを実行しているのですか?すべてのfirebaseクエリが非同期で実行されると思います。 –

+0

@ KamranAhmedKhan、このタスクはバックグラウンドサービスによって呼び出されます。これはスケジュールされたバックグラウンドサービスです(私はFirebase.Jobdispatcherを使用していますが、これはサービスを拡張しています)。私が理解したように、サービスを実行している間にUIスレッドがブロックされているので、ロジックをタスクに移動しました.... [Android IntentService](https://developer.android.com/training/run-background- service/create-service.html) – SteelSailor

答えて

0

最後に私は私の問題を解決しました。私はTaskexecutionの後に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... 
      } 

:代わりにサービスからテントを開始するのは、私は非同期タスクにコードを置くために使用されます。

関連する問題