2017-12-17 12 views
0

Wie entferne ich den Beobachter, nachdem ich das erste Ergebnis erhalten habe? Unten sind zwei Code-Möglichkeiten, die ich ausprobiert habe, aber beide erhalten weiterhin Updates, obwohl ich den Beobachter entfernt habe.LiveData remove Beobachter nach dem ersten Rückruf

Observer observer = new Observer<DownloadItem>() { 
     @Override 
     public void onChanged(@Nullable DownloadItem downloadItem) { 
      if(downloadItem!= null) { 
       DownloadManager.this.downloadManagerListener.onDownloadManagerFailed(null, "this item already exists"); 
       return; 
      } 
      startDownload(); 
      model.getDownloadByContentId(contentId).removeObservers((AppCompatActivity)context); 
     } 
    }; 
    model.getDownloadByContentId(contentId).observeForever(observer); 

model.getDownloadByContentId(contentId).observe((AppCompatActivity)context, downloadItem-> { 
      if(downloadItem!= null) { 
       this.downloadManagerListener.onDownloadManagerFailed(null, "this item already exists"); 
       return; 
      } 
      startDownload(); 
      model.getDownloadByContentId(contentId).removeObserver(downloadItem-> {}); 
     }); 

Antwort

2

Ihre erste wird nicht funktionieren, weil observeForever() ist nicht auf eine LifecycleOwner gebunden.

Ihr zweiter wird nicht funktionieren, weil Sie den vorhandenen registrierten Beobachter nicht an removeObserver() übergeben.

Sie müssen zuerst entscheiden, ob Sie LiveData mit einer LifecycleOwner (Ihre Aktivität) verwenden oder nicht. Meine Annahme ist, dass Sie eine LifecycleOwner verwenden sollten. In diesem Fall verwenden Sie:

Observer observer = new Observer<DownloadItem>() { 
    @Override 
    public void onChanged(@Nullable DownloadItem downloadItem) { 
     if(downloadItem!= null) { 
      DownloadManager.this.downloadManagerListener.onDownloadManagerFailed(null, "this item already exists"); 
      return; 
     } 
     startDownload(); 
     model.getDownloadByContentId(contentId).removeObservers((AppCompatActivity)context); 
    } 
}; 

model.getDownloadByContentId(contentId).observe((AppCompatActivity)context, observer); 
+0

ausgezeichnet. Danke :) – galaxigirl

Verwandte Themen