Android 不调用两次:从ViewModel调用Single.just()到Activity的结果

Android 不调用两次:从ViewModel调用Single.just()到Activity的结果,android,mvvm,rx-java2,Android,Mvvm,Rx Java2,安卓工作室 在build.gradle中: implementation 'io.reactivex.rxjava2:rxjava:2.2.10' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' 在我的ViewModel中,我测试了以下内容: import android.app.Appli

安卓工作室 在build.gradle中:

   implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
在我的ViewModel中,我测试了以下内容:

import android.app.Application
import android.view.View
import androidx.lifecycle.AndroidViewModel
import io.reactivex.Single

    class FilmsRxJavaViewModel(application: Application) : AndroidViewModel(application) {
       
        init {
            Debug.d(TAG, "init:")
            loadData()
        }
    
        fun loadData() {
            Debug.d(TAG, "loadData: first_step")
            var dispose = Single.just(true).subscribe{it -> Debug.d(TAG, "single_result = $it")}
            dispose = Single.just(false).subscribe{it -> Debug.d(TAG, "single_result = $it")}
        }
这里是logcat:

FilmsRxJavaViewModel(12149): init:
FilmsRxJavaViewModel(12149): loadData: first_step
FilmsRxJavaViewModel(12149): single_result = true
FilmsRxJavaViewModel(12149): single_result = false
FilmsRxJavaViewModel(12311): init:
FilmsRxJavaViewModel(12311): loadData: first_step
FilmsRxJavaViewModel(12311): loadData: second_step

FilmsRxJavaActivity(12311): initLogic: isShowProgress = false
正如您可以看到的那样,
Single.just()
Single\u结果打印两次。因为我两次调用了
Single.just()

很好。没错

现在我想在我的活动中打印
Single.just()
的结果:

import androidx.lifecycle.ViewModelProviders
class FilmsRxJavaActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = FilmsRxJavaActivityBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        init()
    }

    private fun init() {

  val viewModelProvider = ViewModelProviders.of(this)
        filmsRxJavaViewModel = viewModelProvider.get(FilmsRxJavaViewModel::class.java)
        var dispose = filmsRxJavaViewModel.isShowProgressSingle
            ?.subscribe { it ->
                Debug.d(TAG, "initLogic: isShowProgress = $it")
            }
    }
在我的活动中:

import androidx.lifecycle.ViewModelProviders
class FilmsRxJavaActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = FilmsRxJavaActivityBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        init()
    }

    private fun init() {

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

  import android.app.Application
  import android.view.View
  import androidx.lifecycle.AndroidViewModel
  import io.reactivex.Single
    
   class FilmsRxJavaViewModel(application: Application) : AndroidViewModel(application) {

var isShowProgressSingle: Single<Boolean>? = null
    init {
        Debug.d(TAG, "init:")
        loadData()
    }

    fun loadData() {
        Debug.d(TAG, "loadData: first_step")
        isShowProgressSingle = Single.just(true)
        Debug.d(TAG, "loadData: second_step")
        isShowProgressSingle = Single.just(false)
    }
正如您在我的活动中看到的那样,
isShowProgress=false

所以它只打印一次为什么不打印(两次)

FilmsRxJavaActivity(12311): initLogic: isShowProgress = true
 FilmsRxJavaActivity(12311): initLogic: isShowProgress = false

首先
Single.just()
操作符是一个静态方法,它创建一个新的
SingleJust
类对象,您可以订阅它,调用它两次并不意味着它将发出两个项,它只是创建一个新对象并将其分配给
isShowProgressSingle

您要查找的是可以发射多个项目的
可观察的
可流动的
,例如:

 isShowProgressObservable = Observable.fromArray(true,false)
如果您想创建一个显示进度的流,一个简单的解决方案是
ReplaySubject
,它是
Observable
的子类,您可以这样创建和使用它:

 val progress = ReplaySubject.create<Boolean>()
 progress.onNext(true)
 progress.onNext(false)
 progress.subscribe{
      //do your thing
 }
val progress=ReplaySubject.create()
progress.onNext(true)
progress.onNext(false)
progress.subscribe{
//做你的事
}