问题描述
Android Studio 4
RxJava2
MVVM
在我的活动中:
import androidx.lifecycle.ViewModelProviders
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
init(listType)
}
private fun init(listType: ListTypeEnum? = ListTypeEnum.LIST) {
Debug.d(TAG,"init: listType = $listType")
setSupportActionBar(binding.filmsToolBarContainer.toolBar)
getSupportActionBar()?.setDisplayShowTitleEnabled(false)
getSupportActionBar()?.setDisplayHomeAsUpEnabled(true)
getSupportActionBar()?.setHomeButtonEnabled(true)
val viewModelProvider = ViewModelProviders.of(this)
filmsRxJavaViewModel = viewModelProvider.get(FilmsRxJavaViewModel::class.java)
initLogic()
}
private fun initLogic() {
var dispose = filmsRxJavaViewModel.isShowProgress
.subscribe { it ->
Log.d(TAG,"initLogic: isShowProgress: $it")
}
}
}
在ViewModel中
class FilmsRxJavaViewModel(application: Application) : AndroidViewModel(application) {
companion object {
private val TAG = FilmsRxJavaViewModel::class.java.name
}
var isShowProgress: ReplaySubject<Boolean> = ReplaySubject.createWithSize(2)
// For PublishSubject you need to observe first,before start emitting something
var toastMessage: PublishSubject<SingleEvent<String>> = PublishSubject.create()
var filmsList: ReplaySubject<List<Film>> = ReplaySubject.createWithSize(1)
init {
Debug.d(TAG,"init:")
loadData()
}
private fun loadData() {
Debug.d(TAG,"loadData:")
val singleResponse: Single<List<Film>> = TransportServiceRxJava.getFilms()
// Only after call .subscribe() then execute network request
val dispose = singleResponse
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {// call before .doOnTerminate()
Debug.d(TAG,"loadData: doOnSubscribe: -> call_showProgress()")
isShowProgress.onNext(true)
}
.doOnTerminate {// call before .subscribe() and call after get response
Debug.d(TAG,"loadData: doOnTerminate: -> call_hideProgress()")
isShowProgress.onNext(false)
}
.subscribe({ it: List<Film> -> // onSuccess and call after get success response
Debug.e(TAG,"loadData: onSuccess: filmsList(${it.size})")
},{ throwable -> // onError and call after get error response
Debug.e(TAG,"loadData: onError: errorMessage ")
})
}
}
这里是启动应用程序后的logcat(3秒后http响应):
FilmsRxJavaActivity( 9954): initLogic: isShowProgress: true
after 3 second
FilmsRxJavaViewModel( 9954): loadData: doOnTerminate: -> call_hideProgress()
FilmsRxJavaActivity( 9954): initLogic: isShowProgress: false
因此isShowProgress
打印两次。在加载数据并获得http响应后。
好。是的。
现在我旋转设备。这里是logcat:
08-11 17:02:56.885 init: listType = LIST
08-11 17:02:56.887 initLogic: isShowProgress: true
08-11 17:02:56.887 initLogic: isShowProgress: false
您可以看到isShowProgress
再次被打印(在我的活动中)。无需等待3秒钟。
每次旋转打印isShowProgress
为什么?
我需要打{{1}} o 只打两次,再打一次。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)