2

비동기 작업에서 Firebasequery를 실행하고 싶습니다. 문제는 Thread.sleep (5000)을 호출해야한다는 것입니다. 예상 결과표를 얻으려고 그렇지 않으면 작업 목록이 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... 
      } 

이 완료 대신 서비스에서 텐트를 시작, 나는 비동기 작업에 코드를 넣어 사용 .