不调用两次:从 ViewModel 调用 Single.just() 到 Activity 的结果
Not call twice: result of call Single.just() from ViewModel to Activity
Android 工作室
在 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
如你所见,Single.just()
single_result 打印了两次。因为我两次调用 Single.just()
不错。没错。
现在我想在 Activity 中打印 Single.just()
的结果:
在我的 Activity:
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)
}
这里 logcat:
FilmsRxJavaViewModel(12311): init:
FilmsRxJavaViewModel(12311): loadData: first_step
FilmsRxJavaViewModel(12311): loadData: second_step
FilmsRxJavaActivity(12311): initLogic: isShowProgress = false
正如你在我的 Activity 中看到的 isShowProgress = false
.
所以它只打印一次。 为什么不打印这个(两次):
FilmsRxJavaActivity(12311): initLogic: isShowProgress = true
FilmsRxJavaActivity(12311): initLogic: isShowProgress = false
?
首先Single.just()
操作符是一个静态方法,它创建一个SingleJust<T>
class的新对象,你可以订阅它,调用它两次并不意味着它将发出两个项目,它只是创建一个新对象并将其分配给 isShowProgressSingle
.
您要查找的是 Observable
或 Flowable
可以发射多个物品的物品,例如:
isShowProgressObservable = Observable.fromArray(true,false)
如果您想创建一个流来显示您的进度,一个简单的解决方案是 ReplaySubject
,它是 Observable
的子 class,您可以像这样创建和使用它:
val progress = ReplaySubject.create<Boolean>()
progress.onNext(true)
progress.onNext(false)
progress.subscribe{
//do your thing
}
Android 工作室 在 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
如你所见,Single.just()
single_result 打印了两次。因为我两次调用 Single.just()
不错。没错。
现在我想在 Activity 中打印 Single.just()
的结果:
在我的 Activity:
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)
}
这里 logcat:
FilmsRxJavaViewModel(12311): init:
FilmsRxJavaViewModel(12311): loadData: first_step
FilmsRxJavaViewModel(12311): loadData: second_step
FilmsRxJavaActivity(12311): initLogic: isShowProgress = false
正如你在我的 Activity 中看到的 isShowProgress = false
.
所以它只打印一次。 为什么不打印这个(两次):
FilmsRxJavaActivity(12311): initLogic: isShowProgress = true
FilmsRxJavaActivity(12311): initLogic: isShowProgress = false
?
首先Single.just()
操作符是一个静态方法,它创建一个SingleJust<T>
class的新对象,你可以订阅它,调用它两次并不意味着它将发出两个项目,它只是创建一个新对象并将其分配给 isShowProgressSingle
.
您要查找的是 Observable
或 Flowable
可以发射多个物品的物品,例如:
isShowProgressObservable = Observable.fromArray(true,false)
如果您想创建一个流来显示您的进度,一个简单的解决方案是 ReplaySubject
,它是 Observable
的子 class,您可以像这样创建和使用它:
val progress = ReplaySubject.create<Boolean>()
progress.onNext(true)
progress.onNext(false)
progress.subscribe{
//do your thing
}