【发布时间】:2020-05-24 12:12:29
【问题描述】:
我是 kotlin 的新手,我正在尝试使用 Rxjava 和 MVVM 架构中的实时数据进行改造。 我配置改造,并在 ViewModel 中使用 observable 和 subscribe 来制作 observable 变量以在活动绑定布局中使用。 我的视图中有一个按钮,当我单击它时,请求方法开始启动并订阅写入自己的数据日志。但是我的变量一开始和几秒钟后变为空,当改造完成其任务时,我的变量获取数据但日志值不更新。
这是我的改造初始化类
class ApiService {
private val INSTANCE =
Retrofit.Builder()
.baseUrl("http://www.janbarar.ir/App/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(IRetrofitMethods::class.java)
private fun <T> callBack(iDataTransfer: IDataTransfer<T>) =
object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
val data = response.body()
if (data != null)
iDataTransfer.onSuccess(data)
else
try {
throw Exception("data is empty")
} catch (ex: Exception) {
iDataTransfer.onError(ex)
}
}
override fun onFailure(call: Call<T>, t: Throwable) {
iDataTransfer.onError(t)
}
}
fun getCategories(iDataTransfer: IDataTransfer<List<Category>>) =
INSTANCE.getCategories().enqueue(callBack(iDataTransfer))
这是一个改造界面
@GET("GetCategories")
fun getCategories(): Call<List<Category>>
这是我的模型课。我认为问题就在这里。因为 observable 在改造完成之前发送空数据。
fun getCategories(): Observable<ArrayList<Category>> {
val result = arrayListOf<Category>()
api.getCategories(object : IDataTransfer<List<Category>> {
override fun onSuccess(data: List<Category>) {
result.addAll(data)
}
override fun onError(throwable: Throwable) {
Log.e("Model", throwable.message!!)
}
})
return Observable.just(result)
}
这也是我的 ViewModel 类
class ProductViewModel(private val model: ProductModel) : ViewModel() {
var isLoading = ObservableField(false)
var categoryList = MutableLiveData<ArrayList<Category>>()
private var compositeDisposable = CompositeDisposable()
fun getCategories() {
isLoading.set(true)
compositeDisposable +=
model.getCategories()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
categoryList.value = it
}, {
Log.e("ViewModel", it.message.toString())
})
isLoading.set(false)
}
最后,这是我的活动
lateinit var binding: ActivityMainBinding
private val vm: ProductViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.vm = vm
vm.categoryList.observe(this, Observer {
if (it != null)
Log.e("activity", it.toString())
})
}
【问题讨论】:
-
您忘记将
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())添加到 Retrofit 中,因此它会立即为您提供Single/Observable,而无需您像现在这样手动进行转换
标签: kotlin mvvm observable retrofit2 rx-java2