旋转设备后再次发出数据

问题描述

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 (将#修改为@)