如何强制(return)在(改造)完成之前不工作
How to force (return) to not work until after (retrofit) finished
你好,我正在尝试研究 dataBinding、mvvm、retrofit 和 rxjava
我在 viewModel 中使用了这段代码
private var mainRepository: MainRepository = MainRepository(NetManager(getApplication()))
val isLoading = ObservableField(false)
var mainModel = MutableLiveData<ArrayList<MainModel>>()
private val compositeDisposable = CompositeDisposable()
fun loadRepositories(id: Int, mainContract: MainContract) {
isLoading.set(true)
compositeDisposable += mainRepository
.getData(id, mainContract)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableObserver<ArrayList<MainModel>>() {
override fun onError(e: Throwable) {
//if some error happens in our data layer our app will not crash, we will
// get error here
}
override fun onNext(data: ArrayList<MainModel>) {
mainModel.value= data
}
override fun onComplete() {
isLoading.set(false)
}
})
}
并且在 MainRepository 中我使用了带有 RxJava 代码的改造
private val model = ArrayList<MainModel>()
fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {
Api.getData.getMainCategory(id)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
model.clear()
model.addAll(it)
AppLogger.log("testingModel1", model.toString())
}, {
AppLogger.log("error", "Failed to load Category : $it")
mainContract.toast("Failed to load Category")
})
AppLogger.log("testingModel2", model.toString())
return Observable.just(model)
}
如果你通知我正在使用日志查看输出数据
但我看到的是
AppLogger.log("testingModel2", model.toString())
和
return Observable.just(model)
比
早 运行
Api.getData.getMainCategory(id)
所以 Logcat testingModel2 中的输出首先是空的,然后是 testingModel1 并且它有数据
所以结果数据在
return Observable.just(model)
没什么
希望大家理解^_^
感谢您的帮助
喜欢:
fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {
return Api.getData.getMainCategory(id)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
}
但记得稍后订阅并添加ErrorHandling
关于日志:subscribe
块中的操作仅在 Api.getData.getMainCategory(id)
发出某些内容时运行的问题,这可能需要一些时间。
你好,我正在尝试研究 dataBinding、mvvm、retrofit 和 rxjava
我在 viewModel 中使用了这段代码
private var mainRepository: MainRepository = MainRepository(NetManager(getApplication()))
val isLoading = ObservableField(false)
var mainModel = MutableLiveData<ArrayList<MainModel>>()
private val compositeDisposable = CompositeDisposable()
fun loadRepositories(id: Int, mainContract: MainContract) {
isLoading.set(true)
compositeDisposable += mainRepository
.getData(id, mainContract)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableObserver<ArrayList<MainModel>>() {
override fun onError(e: Throwable) {
//if some error happens in our data layer our app will not crash, we will
// get error here
}
override fun onNext(data: ArrayList<MainModel>) {
mainModel.value= data
}
override fun onComplete() {
isLoading.set(false)
}
})
}
并且在 MainRepository 中我使用了带有 RxJava 代码的改造
private val model = ArrayList<MainModel>()
fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {
Api.getData.getMainCategory(id)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
model.clear()
model.addAll(it)
AppLogger.log("testingModel1", model.toString())
}, {
AppLogger.log("error", "Failed to load Category : $it")
mainContract.toast("Failed to load Category")
})
AppLogger.log("testingModel2", model.toString())
return Observable.just(model)
}
如果你通知我正在使用日志查看输出数据 但我看到的是
AppLogger.log("testingModel2", model.toString())
和
return Observable.just(model)
比
早 运行Api.getData.getMainCategory(id)
所以 Logcat testingModel2 中的输出首先是空的,然后是 testingModel1 并且它有数据
所以结果数据在
return Observable.just(model)
没什么
希望大家理解^_^
感谢您的帮助
喜欢:
fun getData(id: Int, mainContract: MainContract): Observable<ArrayList<MainModel>> {
return Api.getData.getMainCategory(id)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
}
但记得稍后订阅并添加ErrorHandling
关于日志:subscribe
块中的操作仅在 Api.getData.getMainCategory(id)
发出某些内容时运行的问题,这可能需要一些时间。