gpt4 book ai didi

android - 在 android 中使用 MVVM 架构时在哪里发出 API 请求?

转载 作者:行者123 更新时间:2023-12-03 10:20:32 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.


去年关闭。







Improve this question




我在我的应用程序中使用 MVVM 架构,我想从 Activity 的 viewmodel 类发出 API 请求。这里的问题是我没有得到最好的方法。由于 viewmodel 已经知道该 Activity 的生命周期,因此不需要为 API 创建单独的 viewmodel 类吗?如果是这样,那么我应该从 viewmodel 类触发正常的改造请求,还是在这种情况下最好的方法是什么?

我之前在没有 MVVM 的情况下所做的是:

class UserViewModel : ViewModel() {

private val cd = CompositeDisposable()
val status: MutableLiveData<Boolean>? = MutableLiveData<Boolean>()


val responseImages = MutableLiveData<ResponseImages>()
fun getImages(text: String) {
cd.add(
RetrofitHelper.apiInstance.getImages(Site.METHOD, Site.KEY, text)
.myApiSubscriber(status)
.subscribe({
responseImages.postValue(it)
}, {
it.printStackTrace()
})
)
}


private fun <T> Single<T>.myApiSubscriber(status: MutableLiveData<Boolean>?): Single<T> {
return this.doOnSubscribe {
status?.postValue(true)
// Utils.debugger("PROGRESS ", " doOnSubscribe")
}.doFinally {
status?.postValue(false)
// Utils.debugger("PROGRESS ", " doFinally")
}.subscribeOn(Schedulers.io())
}

override fun onCleared() {
cd.dispose()
super.onCleared()
}

fun callCleared() {
onCleared()
}
}

那么上述方法在 MVVM 的情况下是否仍然有用?遵循 MVVM 的最佳方法是什么?
请建议。

最佳答案

首先,我强烈建议您阅读 Uncle Bob 的 SOLID 原则,以了解为什么您还没有分离代码。

遵循的一种常见做法是使用 Android 文档中建议的存储库模式。这是架构的引用:
Android Architecture Components Reference

我已经分解了每个 block 的作用如下:

Activity/fragment :在这里你可以做所有与 View 相关的事情,比如初始化 RecyclerView,显示对话框, fragment 事务,显示 toast 等。在这里,你还将为 MutableLiveData 注册观察者(存在于你的 ViewModel 中)

查看型号 :ViewModel 包含所有归属于 View 的业务逻辑。 ViewModel 不负责初始化 API 调用。原因是,可能会出现这样一种情况,您需要进一步处理响应并将其存储到数据库中,甚至在 API 出现错误的情况下从数据库中获取数据。

但是,您可以做的是,使用包含执行 API 的所有详细信息的存储库实例调用 API。获取响应后,将值分配给 View 模型中的 livedata,该值由 Fragment/Activity 中注册的观察者观察。

存储库 :这通常是执行所有网络操作和数据库操作的地方。这允许将所有数据从 ViewModel 中分离出来。

这是一个简短的示例

class UserViewModel(private val imageRepository) : ViewModel() {

//Not required since you're using a Single which uses a SingleObserver that doesn't require to be disposed manually.
private val cd = CompositeDisposable()

val responseImages = MutableLiveData<ResponseImages>()
val showError = MutableLiveData<Boolean>()

fun getImages(text: String) =
imageRepository.getImages(text)
.observerOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({
responseImages.value = (it)
}, {
showError.value = true
})


override fun onCleared() {
cd.dispose()
super.onCleared()
}

fun callCleared() {
onCleared()
}
}

//Note: you should ideally just pass the API instance. unless required.
class ImageRepository(val retrofitHelper: RetrofitHelper){

fun getImages(text:String): Single<ResponseImages> {
return retrofitHelper.apiInstance.getImages(Site.Method,Site.key,text)
}

}

//In your Activities onCreate()

class HomeActivity: AppCompatActivity(){

override fun onCreate(bundle: SavedInstanceState?){
viewModel.responseImages.observer(this,Observer {
//do something with your ResponseImages
}
}
}

还有其他事情可以做,例如,为您的存储库使用策略模式,其中 ImageRepository 是一个接口(interface),ImageRepositoryImpl 具有所有详细信息等。但那是另一次了!

SunflowerApp谷歌是一个很好的引用:)

关于android - 在 android 中使用 MVVM 架构时在哪里发出 API 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60684978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com