长期更新 支持网络请求的ViewModel框架【ViewModel+LiveData+Retrofit】
github 地址:https://github.com/miaotaoii/RequestViewModel.git
优势:快捷、方便地使用ViewModel 、LiveData管理数据,自动使用retrofit进行网络请求
无需关心LiveData和retroift request的创建,只要关注UI 控件更新数据的Bean对象
RequestViewMode自动对LiveData进行缓存管理,每个retrofit api接口复用一个livedata
使用: 1.retrofit接口的声明RequestViewModel内部使用retrofit进行网络请求,根据请求参数和返回的泛型类型管理api请求的创建,这一步是Retrofit的基本步骤;
你需要在初始化app时,额外使用RetrofitUtil配置Retrofit baseUrl
RetrofitUtil.baseUrl = RetrofitDataApi.baseUrl;
public interface RetrofitDataApi {
public static final String requestOilprice = "/oilprice/index?key=3c5ee42145c852de4147264f25b858dc";
public static final String baseUrl = "http://api.tianapi.com";
@GET(requestOilprice)
Call getOliPrice(@Query("prov") String prov);
}
2.在Activity或Fragment中创建请求对象
你需要设置请求参数,并在RequestObj构造器中传入retrofit api接口中的的GET或POST注解字符串。参数顺序必须保持和requestObj 的api注解对应的api接口参数一致
RequestObj
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
... ...
//构建请求对象,设置请求api注解和参数,设置api返回对象类型和livedata数据类型
RequestObj requestObj = new RequestObj(RetrofitDataApi.requestOilprice) {
@Override
public Object[] getArgs() {
return new Object[]{formatInputArg()};
}
};
... ...
}
3.继承RequestLiveData,处理返回数据
在这里将服务器返回的数据类型转换为UI需要的类型,并通过LiveData post()数据到UI
public class OliPriceLiveData extends RequestLiveData4.使用RequestViewModel和RequestLiveData请求数据{ @Override public void onLoadSuccess(ResponseJsonBean data) { if (data.getCode() == 200) { PriceBean priceBean = data.getNewslist().get(0); priceBean.setCode(200); postValue(priceBean); } else { PriceBean priceBean = new PriceBean(); priceBean.setCode(data.getCode()); priceBean.setMsg(data.getMsg()); postValue(priceBean); } } @Override public void onLoadFailed(int code, String msg) { PriceBean priceBean = new PriceBean(); priceBean.setCode(code); priceBean.setMsg(msg); postValue(priceBean); } }
RequestViewModel由RequestViewModelProvider提供,你需要传入Retrofit api接口类型;你也可以自定义ViewModel继承自RequestViewModel来处理更多业务逻辑;每个RequestViewModel可以自动管理多个RequestLiveData,RequestObj中的retrofit api注解字符串决定了VeiwModel是否创建新的RequestLiveData或者复用旧的。
RequestLiveData将在首次创建时发出一次请求;如你正在使用google
DataBinding框架,在RequestLiveData 接收数据并postValue后,数据将自动更新到UI控件。
private RequestViewModel requestViewModel;
private OliPriceLiveData liveData;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
... ...
requestViewModel = RequestViewModelProvider.getInstance().get(
this,
RetrofitDataApi.class,
RequestViewModel.class
);
//构建请求对象,设置请求api注解和参数,设置api返回对象类型和livedata数据类型
RequestObj requestObj = new RequestObj(RetrofitDataApi.requestOilprice) {
@Override
public Object[] getArgs() {
return new Object[]{formatInputArg()};
}
};
liveData = requestViewModel.getRequestLiveData(requestObj, OliPriceLiveData.class);
... ...
}
5.设置请求参数,主动请求数据
你也可以使用RequestLiveData 的refresh 方法主动刷新数据;并使用RequestObj setArgs()方法设置新的参数。
requestObj.setArgs(new Object[]{"arg1",1,...});
liveData.refresh();
6.观察RequestLvieData数据变化
同样作为LiveData的子类,你也可以使用observe接口观察数RequestLiveData据变化
liveData.observe(this, new Observer() { @Override public void onChanged(PriceBean priceBean) { if (priceBean.getCode() != 200) { Toast.makeText(MainActivity.this, "请求失败 code =" + priceBean.getCode() + " msg = " + priceBean.getMsg() , Toast.LENGTH_SHORT).show(); } else { //更新ui ,此处使用dataBinding 自动更新到ui Log.i("MainActivity", "price bean onchanged " + priceBean.toString()); } } });



