LiveDataReactiveStreams: преобразование Flowable в LiveData не работает - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь преобразовать Flowable в LiveData и наблюдаю за ним в действии.Мой Flowable передает значения с постоянной задержкой, но LiveData, в который я преобразую этот Flowable, вообще не получает никаких значений в своем наблюдателе.Я создал образец кода для демонстрации проблемы

Activity

    public class MyrActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);
            MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
            myViewModel.init();
            myViewModel.getListLiveData().observe(this, new Observer<List<String>>() {
                @Override
                public void onChanged(@Nullable List<String> strings) {
                    Timber.d("value received in live data observer: %s", strings);
                    // This callback never get called
                    for (String string : strings) {
                        Timber.d(string);
                    }
                }
            });

        }
    }

Класс ViewModel

     static class MyViewModel extends ViewModel{
            LiveData<List<String>> mListLiveData;
            PublishProcessor<String> mStringPublishProcessor = PublishProcessor.create();

            public void init() {
                mListLiveData = LiveDataReactiveStreams.fromPublisher(mStringPublishProcessor.toList().toFlowable());

                // This is to trigger the mStringPublishProcessor on constant intervals
                Observable.interval(0,5,TimeUnit.SECONDS)
                        .map(aLong -> {
                            Timber.d("value emitted: ");  // this log is showing as expected
                            mStringPublishProcessor.onNext("Value "+aLong);
                            return aLong;
                        }).subscribe();
            }

            public LiveData<List<String>> getListLiveData() {
                return mListLiveData;
            }
        }

Теперь в своей деятельности я вижу только журналы изObservable.interval

     com.example.app D/MyActivity$MyViewModel: value emitted: 
     com.example.app D/MyActivity$MyViewModel: value emitted: 
     com.example.app D/MyActivity$MyViewModel: value emitted: 
     com.example.app D/MyActivity$MyViewModel: value emitted: 
     com.example.app D/MyActivity$MyViewModel: value emitted: 
     com.example.app D/MyActivity$MyViewModel: value emitted: 

Почему наблюдатель LiveData никогда не получал никаких значений от Flowable?

согласно документации LiveDataReactiveStreams.fromPublisher

Создает Observableпоток от издателя ReactiveStreams.Когда LiveData становится активным, он подписывается на эмиссии от издателя.

1 Ответ

0 голосов
/ 16 ноября 2018

.toList() отобразит возврат только после onComplete() вызова.В вашем примере завершение никогда не вызывается.

...