Я пытаюсь преобразовать 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 становится активным, он подписывается на эмиссии от издателя.