LiveData+Retrofit网络请求实战

本文介绍了如何使用LiveData与Retrofit结合进行网络请求实战,包括如何利用map和switchMap进行数据转换,展示加载进度,以及分页请求的实现。通过ViewModel管理LiveData,使用SwipeRefreshLayout和KProgressHUD展示加载进度,结合SmartRefreshLayout实现分页加载。此外,还展示了如何在MainActivity中初始化并展示轮播图。
摘要由CSDN通过智能技术生成

LiveData可以通过Transformations的map和switchMap操作,将一个LiveData转成另一种类型的LiveData,效果与RxJava的map/switchMap操作符类似。可以看看两个函数的声明

public static <X, Y> LiveData map(
@NonNull LiveData source,
@NonNull final Function<X, Y> mapFunction)

public static <X, Y> LiveData switchMap(
@NonNull LiveData source,
@NonNull final Function<X, LiveData> switchMapFunction)

根据以上代码,我们可以知道,对应的变换函数返回的类型是不一样的:map是基于泛型类型的变换,而switchMap则返回一个新的LiveData

还是以banner请求为例,我们将map和switchMap应用到实际场景中: 1: 为了能够手动控制请求,我们需要一个refreshTrigger触发变量,当这个变量被设置为true时,通过switchMap生成一个新的LiveData用作请求banner

private val refreshTrigger = MutableLiveData()
private val api = WanApi.get()
private val bannerLis:LiveData<ApiResponse<List>> = Transformations.switchMap(refreshTrigger) {
//当refreshTrigger的值被设置时,bannerList
api.bannerList()
}

2: 为了展示banner,我们通过map将ApiResponse转换成最终关心的数据是List<BannerVO>

val banners: LiveData<List> = Transformations.map(bannerList) {
it.data ?: ArrayList()
}

LiveData与ViewModel结合

为了将LiveDataActivity解耦,我们通过ViewModel来管理这些LiveData

class HomeVM : ViewModel() {
private val refreshTrigger = MutableLiveData()
private val api = WanApi.get()
private val bannerList: LiveData<ApiResponse<List>> = Transformations.switchMap(refreshTrigger) {
//当refreshTrigger的值被设置时,bannerList
api.bannerList()
}

val banners: LiveData<List> = Transformations.map(bannerList) {
it.data ?: ArrayList()
}

fun loadData() {
refreshTrigger.value = true
}
}

在activity_main.xml中加入banner布局,这里使用BGABanner-Android来显示图片

<?xml version="1.0" encoding="utf-8"?>





<cn.bingoogolapple.bgabanner.BGABanner
android:id=“@+id/banner”
android:layout_width=“match_parent”
android:layout_height=“120dp”
android:paddingLeft=“16dp”
android:paddingRight=“16dp”
app:banner_indicatorGravity=“bottom|right”
app:banner_isNumberIndicator=“true”
app:banner_pointContainerBackground=“#0000”
app:banner_transitionEffect=“zoom”/>



然后在MainActivity完成Banner初始化,通过监听ViewModel中的banners实现轮播图片的展示。

class MainActi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值