【发布时间】:2020-01-10 11:49:03
【问题描述】:
我是 MVVVM 的新手,我按照 Google 的 GihubBrowser 示例实施改造将 LiveData 回调,但我无法使用此实施对 rerofit 请求进行排队。请帮助我做错了什么:
存储库
class LoginRepository(var application: Application) {
var result = MutableLiveData<Resource<GenericResponse>>()
fun iniateOTPprocess() {
result = object : NetworkBoundResource<GenericResponse, GenericResponse>() {
override fun createCall() = RetroUtils.getApiManager().listRepos()
override fun processResponse(response: ApiSuccessResponse<GenericResponse>)
: GenericResponse {
val body = response.body
return body
}
}.asLiveData()
}
fun getData(): MutableLiveData<Resource<GenericResponse>> {
return result
}
}
视图模型
class LoginViewModel2(application: Application) : AndroidViewModel(application) {
lateinit var username: MutableLiveData<String>
lateinit var password: MutableLiveData<String>
var repository: LoginRepository = LoginRepository(application)
var data = MediatorLiveData<Resource<GenericResponse>>()
init {
data.addSource(repository.getData(), Observer {
data.postValue(it)
})
}
fun onLoginBtnCLicked() {
initiateOTP()
}
private fun initiateOTP() {
repository.iniateOTPprocess()
}
fun getResponse() : MutableLiveData<Resource<GenericResponse>>{
return data
}
}
下面提到的是适配器
class LiveDataCallAdapter<R>(private val responseType: Type) :
CallAdapter<R, LiveData<ApiResponse<R>>> {
override fun responseType() = responseType
override fun adapt(call: Call<R>): LiveData<ApiResponse<R>> {
return object : LiveData<ApiResponse<R>>() {
private var started = AtomicBoolean(false)
override fun onActive() {
super.onActive()
if (started.compareAndSet(false, true)) {
call.enqueue(object : Callback<R> {
override fun onResponse(call: Call<R>, response: Response<R>) {
postValue(ApiResponse.create(response))
}
override fun onFailure(call: Call<R>, throwable: Throwable) {
postValue(ApiResponse.create(throwable))
}
})
}
}
}
}
}
活动
class LoginActivity2 : AppCompatActivity() {
lateinit var binding: LoginViewBinding;
lateinit var vModel: LoginViewModel2;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.login_view)
binding.setLifecycleOwner(this)
vModel = ViewModelProviders.of(this).get(LoginViewModel2::class.java)
binding.loginViewModel = vModel
vModel.getResponse().observe(this, Observer { t ->
Log.e("data", t?.data.toString() ?: "Data is null")
})
}
}
请注意这不是重复的
Retrofit LiveDataCallAdapter doesn't call function adapt (call)
如果我直接在 viewmodel 中直接观察 initialOTP() 方法,我可以使这段代码工作,但这样 API 将被命中,甚至无需点击我不想要的按钮。
请提出最佳方法。提前致谢。
【问题讨论】:
标签: android kotlin mvvm retrofit2 android-livedata