1. ホーム
  2. android

[解決済み] LiveDataは最初のコールバックの後にObserverを削除する

2022-11-21 10:47:16

質問

最初の結果を受け取った後、オブザーバを削除するにはどうすればよいのでしょうか。以下は私が試した2つのコードの方法ですが、どちらもオブザーバを削除したにもかかわらず、更新を受信し続けています。

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

どのように解決するのですか?

最初のものはうまくいきません。 observeForever() はどの LifecycleOwner .

2 番目の例はうまくいきません。なぜなら、既存の登録済みオブザーバを removeObserver() .

を使うかどうかをまず決める必要があります。 LiveDataLifecycleOwner (あなたのアクティビティ)を使うかどうか。私の仮定では、あなたは LifecycleOwner . その場合、使用します。

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