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 =
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
}