gpt4 book ai didi

java - 在使用改造从服务器获取数据之前显示进度条

转载 作者:行者123 更新时间:2023-12-04 07:20:24 25 4
gpt4 key购买 nike

我正在使用改造、协程、livedata、mvvm 开发一个在线购物应用程序...
我想在从服务器获取数据几秒钟之前显示进度条
如果我有一个 api 请求,我可以显示,但在这个应用程序中我有多个请求
在这种情况下我应该怎么做我应该如何显示进度条?
API服务

 @GET("homeslider.php")
suspend fun getSliderImages(): Response<List<Model.Slider>>

@GET("amazingoffer.php")
suspend fun getAmazingProduct(): Response<List<Model.AmazingProduct>>

@GET("handsImages.php")
suspend fun getHandsFreeData(
@Query(
"handsfree_id"
) handsfree_id: Int
): Response<List<Model.HandsFreeImages>>

@GET("handsfreemoreinfo.php")
suspend fun gethandsfreemoreinfo(): Response<List<Model.HandsFreeMore>>


@GET("wristmetadata.php")
suspend fun getWristWatchMetaData(
@Query(
"wrist_id"
) wrist_id: Int
): Response<List<Model.WristWatch>>
存储库
 fun getSliderImages(): LiveData<List<Model.Slider>> {
val data = MutableLiveData<List<Model.Slider>>()
val job = Job()
applicationScope.launch(IO + job) {
val response = api.getSliderImages()
withContext(Main + SupervisorJob(job)) {
data.value = response.body()
}
job.complete()
job.cancel()
}
return data
}

fun getAmazingOffer(): LiveData<List<Model.AmazingProduct>> {
val data = MutableLiveData<List<Model.AmazingProduct>>()
val job = Job()
applicationScope.launch(IO + job) {
val response = api.getAmazingProduct()
withContext(Main + SupervisorJob(job)) {
data.value = response.body()
}
job.complete()
job.cancel()
}
return data
}

fun getHandsFreeData(handsree_id: Int): LiveData<List<Model.HandsFreeImages>> {

val dfData = MutableLiveData<List<Model.HandsFreeImages>>()

val job = Job()
applicationScope.launch(IO + job) {


val response = api.getHandsFreeData(handsree_id)

withContext(Main + SupervisorJob(job)) {
dfData.value = response.body()

}
job.complete()
job.cancel()

}
return dfData
}

fun getHandsFreeMore(): LiveData<List<Model.HandsFreeMore>> {

val data = MutableLiveData<List<Model.HandsFreeMore>>()
val job = Job()
applicationScope.launch(IO + job) {

val response = api.gethandsfreemoreinfo()


withContext(Main + SupervisorJob(job)) {

data.value = response.body()

}
job.complete()
job.cancel()
}

return data
}
查看型号
fun getSliderImages() = repository.getSliderImages()

fun getAmazingOffer() = repository.getAmazingOffer()

fun recieveAdvertise() = repository.recieveAdvertise()

fun dailyShoes(context: Context) = repository.getDailyShoes(context)
我会感谢你的帮助

最佳答案

我不禁注意到您的存储库包含大量重复代码。这里要学习的第一点是Repository 中的所有逻辑。 , 它通常放在 ViewModel .第二件事是您正在使用 applicationScope启动您的coroutines ,通常使用 viewModelScope (负责取消)每个 viewModel 中可用的对象.
所以首先我们必须处理那些重复的代码并将其移动到 ViewModel .所以你的 viewModel 现在看起来像

class YourViewModel: ViewModel() {
// Your other init code, repo creation etc

// Live data objects for progressBar and error, we will observe these in Fragment/Activity
val showProgress: MutableLiveData<Boolean> = MutableLiveData()
val errorMessage: MutableLiveData<String> = MutableLiveData()

/**
* A Generic api caller, which updates the given live data object with the api result
* and internally takes care of progress bar visibility. */
private fun <T> callApiAndPost(liveData: MutableLiveData<T>,
apiCall: () -> Response<T> ) = viewModelScope.launch {
try{
showProgress.postValue(true) // Show prgress bar when api call is active
if(result.code() == 200) { liveData.postValue(result.body()) }
else{ errorMessage.postValue("Network call failed, try again") }
showProgress.postValue(false)
}
catch (e: Exception){
errorMessage.postValue("Network call failed, try again")
showProgress.postValue(false)
}
}

/******** Now all your API call methods should be called as *************/

// First declare the live data object which will contain the api result
val sliderData: MutableLiveData<List<Model.Slider>> = MutableLiveData()

// Now call the API as
fun getSliderImages() = callApiAndPost(sliderData) {
repository.getSliderImages()
}
}
之后从 Repository 中删除所有逻辑并使其简单地将网络方法称为
suspend fun getSliderImages() = api.getSliderImages()   // simply delegate to network layer
最后显示进度条 ,只需观察 showProgress LiveData您的 Activity 中的对象/ Fragment作为
viewModel.showProgress.observer(this, Observer{
progressBar.visibility = if(it) View.VISIBLE else View.GONE
}

关于java - 在使用改造从服务器获取数据之前显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68548658/

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