как показано ниже:

далить наблюдателя после получения первого результата? Ниже приведены два кода, которые я пробовал, но они оба продолжают получать обновления, даже если я удалил наблюдателя.

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

Ответы на вопрос(1)

Решение Вопроса

observeForever() не привязан ни к какомуLifecycleOwner.

Ваш второй не будет работать, потому что вы не передаете существующего зарегистрированного наблюдателяremoveObserver().

Сначала вы должны решить, используете ли выLiveData сLifecycleOwner (ваша деятельность) или нет. Я предполагаю, что вы должны использовать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);
 MrVasilev01 нояб. 2018 г., 09:32
@CommonsWare Спасибо за ваш ответ, вы правы, это была проблема с Kotlin. Просто отметьте, что для Kotlin, возможно, решение состоит в том, чтобы создать расширение 'LiveData', например: fun <T> LiveData <T> .observeOnlyOnce (lifecycleOwner: LifecycleOwner, наблюдатель: Observer <T>) {наблюдатель (lifecycleOwner, объект: Observer) <T> {переопределить fun onChanged (t: T?) {Наблюдатель.onChanged (t) removeObserver (this)}})}
 CommonsWare31 окт. 2018 г., 22:53
@MrVasilev: Это может быть проблема с поддержкой Kotlin SAM для лямбд или что-то в этом роде. Вам может понадобиться использоватьobject : Observer и создать "настоящий"Observer Например, чтобы получить правильныйthis изнутриObserver«sonChanged() функция.
 MrVasilev31 окт. 2018 г., 12:46
@CommonsWare Извините, если мне не ясно. Когда я пытаюсь сделать это: var liveData = viewModel.findNearestDriver (location) liveData.observe (this, Observer {liveData.removeObserver (this)})) я получил ошибку компиляции «Несоответствие типов», потому что это не мой Observer, а мой Фрагмент
 CommonsWare31 окт. 2018 г., 12:06
@MrVasilev: я не знаю, что означает «текущий» в этом контексте. Чтобы удалить одного наблюдателя, позвонитеremoveObserver() наLiveData.
 MrVasilev31 окт. 2018 г., 11:56
Это удалит всех Наблюдателей из Деятельности / Фрагмента. Как мы можем удалить только текущий Обозреватель, а не все?

Ваш ответ на вопрос