旋转设备后再次发出数据

问题描述

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...