gpt4 book ai didi

android - 在android中实现MVVM时对网络层的错误处理感到困惑,如何通知用户有问题?

转载 作者:行者123 更新时间:2023-11-29 02:20:06 26 4
gpt4 key购买 nike

在过去的几个月里,我一直在与 MVVM 模式和 android-architecture-components 作斗争。在我的上一个项目中,虽然我确实尝试分离我的一些应用程序逻辑,但它以大量代码困惑而告终。每个 fragment 都做了很多工作,从处理 UI 到处理网络请求以及......在这个新应用程序中,我遵循了 Android 应用程序架构的最佳实践,到目前为止一切顺利。但问题是,我不知道如何处理网络错误,而且我不知道如果某些网络调用失败我应该如何通知用户。

在搜索和阅读一些博客文章后,我最终得到了以下代码(SafeApiCall 和 SafeApiResutl)函数来在一个地方处理网络请求,但问题是,我所有的网络请求都是使用改造和 NetworkDataSource 类完成的,然后我将 NetworkDataSource 和 Dao 传递给 RepositoryImpl 类,该类是我的存储库接口(interface)的实现。然后我将存储库传递给 viewModel,因此 ViewModel 对网络或 Dao 或其他任何东西一无所知。所以问题来了,如果出现任何网络错误,我该如何通知用户?我考虑过创建一个 LiveData<> 并在网络层将错误传递给它,但在这种情况下,存储库必须观察到这一点,并且假设在存储库中创建一个 LiveData 以便 viewModel 观察到它等等......但这太很多链接,我不喜欢这样做的想法。我也看过 GoogleSamples Todo-MVVM-live-kotlin 项目,但老实说我不明白发生了什么。


suspend fun <T : Any> safeApiCall(call: suspend () -> Response<BasicResponse<T>>, errorMessage: String): T? {
return when (val result = safeApiResult(call)) {
is NetworkResult.Success -> {
Timber.tag("safeApiCall").d("data is ${result.serverResponse.data}")
result.serverResponse.data
}
is NetworkResult.Error -> {
Timber.tag("SafeApiCall").e("$errorMessage & Exception - ${result.exception}")
null
}
else -> TODO()
}
}


private suspend fun <T : Any> safeApiResult(
call: suspend () -> Response<BasicResponse<T>>
): NetworkResult<T> {
return try {
val response = call.invoke()
Timber.tag("SafeApiResult")
.d("response code : ${response.code()}, server value : ${response.body()!!.status}, server message: ${response.body()!!.message}")
if (response.isSuccessful) {
return when (ServerResponseStatus.fromValue(response.body()!!.status)) {
ServerResponseStatus.SUCCESS -> NetworkResult.Success(response.body()!!)
ServerResponseStatus.FAILED -> TODO()
ServerResponseStatus.UNKNOWN -> TODO()
}
} else {
TODO()
}
} catch (exception: Exception) {
Timber.tag("SafeApiResultFailed").e(exception)
NetworkResult.Error(exception)
}

}


sealed class NetworkResult<out T : Any> {
data class Success<out T : Any>(val serverResponse: BasicResponse<out T>) : NetworkResult<T>()
data class Error(val exception: Exception) : NetworkResult<Nothing>()
}

最佳答案

你在正确的道路上。我会将这两种方法都放在 NetworkDataSource 中.所有执行的调用都应调用这些方法来处理错误。

NetworkDataSource会将 NetworkResult 返回到存储库,并将结果返回到 ViewModel。

如您所说,您可以使用 LiveData 来通知 Activity/Fragment。您可以创建一个错误数据类:

data class ErrorDialog(
val title: String,
val message: String
)

并声明一个LiveData<ErrorDialog>这将从您的角度观察到。然后,当您在 View 中收到通知时,您可以在 BaseActivity 中实现逻辑/BaseFragment显示DialogToast或任何类型的 View 来指示错误。

关于android - 在android中实现MVVM时对网络层的错误处理感到困惑,如何通知用户有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56784983/

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