Search code examples
androidmvvmrx-java2

Not call subscribe() for PublishSubject


Android Studio 5, RxJava2

In my Activity:

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Debug.d(TAG, "onCreate: savedInstanceState = $savedInstanceState")
        setContentView(R.layout.films_rx_java_activity)
        binding = FilmsRxJavaActivityBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        val listType: ListTypeEnum = intent.getSerializableExtra(LIST_TYPE) as ListTypeEnum
        initLogic()
    }
private fun initLogic() {

    val viewModelProvider = ViewModelProviders.of(this)
    filmsRxJavaViewModel = viewModelProvider.get(FilmsRxJavaViewModel::class.java)
        var dispose = filmsRxJavaViewModel.isShowProgress
            .subscribe { it ->
                Debug.d(TAG, "initLogic: isShowProgress = $it")
            }
    }

In my ViewModel:

      import io.reactivex.subjects.PublishSubject

 class FilmsRxJavaViewModel(application: Application) : AndroidViewModel(application) {
        var isShowProgress: PublishSubject<Boolean> = PublishSubject.create()
        
            init {
                Debug.d(TAG, "init:")
                isShowProgress.onNext(true)
                loadData()
            }
        
            fun loadData() {
                Debug.d(TAG, "loadData")
                isShowProgress.onNext(false)
            }

In logcat:

myRxJavaViewModel(16488): init:
myRxJavaViewModel(16488): loadData

Why not call .subscribe { in my Activity. And as result to print

initLogic: isShowProgress =

Solution

  • This happens because you have emit with isShowProgress.onNext(true) while there is no observer yet.

    You need to observe first, before start emitting something

    Try it like this

    private fun initLogic() {
        val viewModelProvider = ViewModelProviders.of(this)
        filmsRxJavaViewModel = viewModelProvider.get(FilmsRxJavaViewModel::class.java)
            var dispose = filmsRxJavaViewModel.isShowProgress
                .subscribe { it ->
                    Debug.d(TAG, "initLogic: isShowProgress = $it")
                }
        filmsRxJavaViewModel.loadData() // Add this line
    }