gpt4 book ai didi

android - 如何使用 liveData 处理错误

转载 作者:行者123 更新时间:2023-12-02 12:19:22 24 4
gpt4 key购买 nike

在我的应用中,我有这个流程:

我 fragment 中的 ClickListender:

  search_button.setOnClickListener {
if(search_input.text.isNullOrEmpty())
Toast.makeText(activity, "Input Error", Toast.LENGTH_LONG).show()
else
viewModel.onSearchButtonClicked(search_input.text.toString())
}

onSearchButtonClickedviewModel 中:

    fun onSearchButtonClicked(input: String) {
coroutineScope.launch {
repo.insertToDatabase(input)
}
}

insertToDatabaseRepository 中:

   suspend fun insertToDatabase(string: String) {
withContext(Dispatchers.IO) {
val dataList =
ExternalApi.retrofitCall.getData(string).await()
if (dataList.intialDataResult < 1) {
//show error
} else {
//all good
database.myDataBase.insertAll(dataList)
}
}
}

如果 intialDataResult 小于 1,我需要显示错误消息。我考虑过在我的存储库中创建初始值为 false 的 MutableLiveData 并通过 viewModel 从 fragment 中监听,但这不是一个好方法,因为我无法设置 LiveData 在我显示错误消息后再次设置为“false”。

我还尝试从 insertToDatabase 函数返回 bool 值并决定是否显示错误,但没有成功。

有什么办法可以解决这个问题吗?

最佳答案

为什么不创建一个 LiveData 来管理您工作的结果状态?

创建一个类来存储工作结果 why sealed class?

sealed class ResultState{
object Success: ResultState() // this is object because I added no params
data class Failure(val message: String): ResultState()
}

创建一个 LiveData 来报告这个结果

val stateLiveData = MutableLiveData<ResultState>()

使insertToDatabase()返回一个结果

suspend fun insertToDatabase(input: String): ResultState {
return withContext<ResultState>(Dispatchers.IO) {

val dataList =
ExternalApi.retrofitCall.getData(string).await()
if (dataList.intialDataResult < 1) {
return@withContext ResultState.Failure("Reason of error...")
} else {
database.myDataBase.insertAll(dataList)
return@withContext ResultState.Success
}
}
}

现在,向UI报告结果

fun onSearchButtonClicked(input: String) {
coroutineScope.launch {
val resultState = repo.insertToDatabase(input)
stateLiveData.value = resultState
}
}

在用户界面中,

viewModel.stateLiveData.observe(viewLifeCycleOwner, Observer { state ->

when (state) {
is ResultState.Success -> { /* show success in UI */ }
is ResultState.Failure -> { /* show error in UI with state.message variable */ }
}
})

同样,您可以添加一个 ResultState.PROGRESS 来显示 UI 中正在运行一个任务。

如果您有任何疑问,请添加评论。

关于android - 如何使用 liveData 处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61523588/

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