Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android ViewModel Retrofit

Github简单易用的 Android ViewModel Retrofit框架

作者:​ OCode   ​

这篇文章主要介绍了Github简单易用的Android ViewModel Retrofit框架,RequestViewMode有自动对LiveData进行缓存管理,每个retrofit api接口复用一个livedata的优势。下文具体详情,感兴趣的小伙伴可以参考一下

RequestViewModel

优势:

Gradle

项目根目录下 build.gradle 添加

allprojects {
    repositories {
        google()
        maven { url 'https://jitpack.io' }
        jcenter()
    }
}

module的build.gradle 中添加:

dependencies {
	implementation 'com.github.miaotaoii:RequestViewModel:1.0.3'

}

使用

1.retrofit接口的声明

RequestViewModel内部使用retrofit进行网络请求,框架会根据请求的注解字和参数及返回值类型管理retrofit请求对象的创建;第一步是Retrofit的基本步骤;

public interface RetrofitDataApi {
    public static final String requestOilprice = "/oilprice/index?key=3c5ee42145c852de4147264f25b858dc";
    public static final String baseUrl = "http://api.tianapi.com";
    
    //ResponseJsonBean对象是自定义的服务器返回json类型,可以是泛型类型,如 ResponseData<UserInfo>
    @GET(requestOilprice)
    Call<ResponseJsonBean> getOliPrice(@Query("prov") String prov);
}

2.retrofit配置

你需要在初始化app时,额外使用RetrofitConfig配置你自己的Retrofit实例或使用默认创建retrofit实例

方式1:

使用项目已有的retrofit实例:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(RetrofitDataApi.baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(new OkHttpClient.Builder()
                        .build())
                .build();
RetrofitConfig.getInstance(retrofit).init();

方式2:

设置baseurl,框架会帮你创建默认的retrofit实例

RetrofitConfig.getInstance(RetrofitDataApi.baseUrl).init();

3.在Activity或Fragment中创建请求对象

你需要设置请求参数,并在RequestObj构造器中传入retrofit api接口中的的GET或POST注解字符串。参数顺序必须保持和requestObj 的api注解对应的api接口参数一致

RequestObj<T> 泛型声明api请求返回的类型,T类型支持本身为泛型类型; 你将会在你自己继承RequestLiveData的类中,对返回数据进行转化解析并post到UI中

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		... ...
//构建请求对象,设置请求api注解和参数,设置api返回对象类型和livedata数据类型
RequestObj<ResponseJsonBean> requestObj = new RequestObj<ResponseJsonBean>(RetrofitDataApi.requestOilprice) {
            @Override
            public Object[] getArgs() {
                return new Object[]{formatInputArg()};
            }
        };
		... ... 
}

4.继承RequestLiveData,处理返回数据

在这里将服务器返回的数据类型转换为UI需要的类型,并通过LiveData post()数据到UI。第一个泛型参数是retrofit请求返回的数据类型,第二个泛型参数是LiveData持有的数据类型。

public class OliPriceLiveData extends RequestLiveData<ResponseJsonBean, PriceBean> {
    @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);
    }
}

5.使用RequestViewModel和RequestLiveData请求数据

RequestViewModelRequestViewModelProvider提供,你需要传入Retrofit api接口类型;你也可以自定义ViewModel继承自RequestViewModel来处理更多业务逻辑;每个RequestViewModel可以自动管理多个RequestLiveDataRequestObj中的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<ResponseJsonBean> requestObj = new RequestObj<ResponseJsonBean>(RetrofitDataApi.requestOilprice) {
            @Override
            public Object[] getArgs() {
                return new Object[]{formatInputArg()};
            }
        };

	liveData = requestViewModel.getRequestLiveData(requestObj, OliPriceLiveData.class);

	... ... 
}

6.设置请求参数,主动请求数据

你也可以使用RequestLiveData 的refresh 方法主动刷新数据;并使用RequestObj setArgs()方法设置新的参数。

  requestObj.setArgs(new Object[]{"arg1",1,...});
  liveData.refresh();

7.观察RequestLvieData数据变化

同样作为LiveData的子类,你也可以使用observe接口观察数RequestLiveData据变化

 liveData.observe(this, new Observer<PriceBean>() {
            @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());
                }
            }
        });

8.日志打印

默认只打印ERROR日志,INFO日志开启后将打印所有请求执行的api接口方法签名、请求参数、请求response code以及处理请求的对象hash值。

RetrofitConfig.setLogLevel(Logger.LogLevel.INFO);
I/[RequestViewModel]: TypedRequest[com.ocode.requestvm.request.TypedRequestImpl@96f475c] ------>[interface com.requestVM.demo.api.RetrofitDataApi]  (public abstract retrofit2.Call<com.requestVM.demo.api.ResponseJsonBean> com.requestVM.demo.api.RetrofitDataApi.getOliPrice(java.lang.String,java.lang.String)) args{上海,test,}
I/[RequestViewModel]: TypedRequest[com.ocode.requestvm.request.TypedRequestImpl@96f475c ]onResponse call return s

到此这篇关于Github简单易用的 Android ViewModel Retrofit框架的文章就介绍到这了,更多相关 Android ViewModel Retrofit 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文