Github上 简单易用的 Android ViewModel Retrofit框架

2023-11-08

RequestViewModel

长期更新 支持网络请求的ViewMode框架【ViewModel+LiveData+Retrofit】

github 地址:https://github.com/miaotaoii/RequestViewModel.git

优势:

快捷、方便地使用ViewModel 、LiveData管理数据,自动使用retrofit进行网络请求

无需关心LiveData和retroift request的创建,只要关注UI 控件更新数据的Bean对象

RequestViewMode自动对LiveData进行缓存管理,每个retrofit api接口复用一个livedata

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.使用RequestViewModelRequestLiveData请求数据

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 success code=200

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Github上 简单易用的 Android ViewModel Retrofit框架 的相关文章

随机推荐

  • tar打包的时候忽略一些目录

    我的个人博客 逐步前行STEP tar打包的时候忽略版本管理文件目录 日志文件目录 storage app目录 tar zcvf web tar gz web exclude vcs exclude storage logs exclude
  • SQL service 数据库 某工厂的物料管理系统数据库设计与实现

    实现物料的分类管理 实现部门和员工信息管理 实现物料的入库和领用管理 实现物料的转仓管理 创建触发器 实现物料入库和领用时相应物料库存的自动更新 创建触发器 实现转仓时转入仓库物料增加 转出仓库物料减少 创建存储过程统计各仓库各种物料的现存
  • docker启动报错:Job for docker. service failed because the control process exited with error code

    1 在使用systemctl start docker时 一直报错 如下图 试了网上的方法 a 修改docker service文件 b 在daemon json中增加代码 都不能解决我遇到的情况 2 经过不懈努力 终于找到办法 在 etc
  • 存量时代下,期货公司如何借助内容实现运营突破

    QuestMobile在 中国移动互联网发展启示录 中披露了一组数据 截止到2021年9月 中国的网民总人数达到11 67亿人 同比仅增加1400万 以上数据表明 流量红利消失殆尽已成为既定的事实 对期货公司来说 流量红利的消失也让其陷入用
  • 电源系列2:LDO 基本 原理(二)

    公众号 工程师看海 后台回复 LDO仿真文件 远山看海 LDO基本原理介绍 一 zhuanlan zhihu com NMOS LDO工作简介 下图是一个NMOS LDO的基本框图 NMOS LDO一般也工作在饱和区 特殊时会在可变电阻区
  • gensim读取已训练模型LDA模型的模型与dictionary

    import pyLDAvis gensim from gensim import models corpora from gensim corpora import Dictionary all data 青绿色 放 几天 塑料袋 里 刺
  • 世界经济论坛区块链报告阅读笔记

    文章目录 世界经济论坛区块链报告阅读笔记 DLT应用落地需要什么 报告案例 Global Payments 报告案例 P C Claims Processing 世界经济论坛区块链报告阅读笔记 该报告主要谈及DLT distributed
  • Android onKeyDown监听返回键无效的解决办法

    文章转载自 https www jb51 net article 115941 htm Android onKeyDown监听返回键无效的解决办法 当我们的Activity继承了TabActivity 在该类中重写onKeyDown是监听不
  • node切换版本

    1 首先卸载node 删除node文件夹 在C Program Files路径下查找 2 安装nvm 下载nvm setup zip文件 进行安装 nvm网址 Releases coreybutler nvm windows GitHub
  • 数据表中常见的数据类型

    数据表中常见的数据类型有 整数类型 浮点数类型 日期与时间类型 字符串类型 二进制类型 布尔类型 整数类型 1int型 表示整型数值 是由四个字节组成的整数 输出范围 2147 2147 数据类型32位 short型 表示短整型 输出范围是
  • 项目_MySQL服务器被入侵,数据丢失,一招教你恢复数据【已恢复】

    已恢复 MySQL服务器被入侵 数据丢失 一招教你恢复数据 0 前言 当时在宝塔安装了MySQL5 7 然后当时只是测试 就直接设置用户名和密码为root 今天在Navicat突然登录不上了 于是在linux下登录MySQL 只剩下一个Re
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)

    目录 前言 面向过程和面向对象 类和对象 Python中类的定义 1 类的定义形式 2 深层剖析类对象 前言 感谢各位的一路陪伴 我学习Python也有一个月了 在这一个月里我收获满满 学到了很多知识 每当我学会了一个新的知识点我会发表一篇
  • 压控恒流源学习笔记

    激光二极管 以下称LD 即使采用恒流驱动 其光输出功率也会随温度变化而发生大的变动 因此必须监视它的光输出 利用反馈环路来控制驱动电流 这即是自动输出控制APC AutomatICPowerControl 电路 第一种 调节激光亮度 可以依
  • Java——ArrayList基本使用

    1 简介 ArrayList是实现List接口的 底层采用数组实现 ArrayList 实现了Cloneable接口 即覆盖了函数clone 能被克隆 ArrayList 实现java io Serializable接口 这意味着Array
  • LRU缓存机制

    LRU缓存机制LeetCode146官方题解 struct DLinkedNode int key value DLinkedNode prev DLinkedNode next DLinkedNode key 0 value 0 prev
  • spring boot 启动报错,找不到DataSource

    报错信息如下 16 39 11 372 1653 main WARN o s b c e AnnotationConfigEmbeddedWebApplicationContext AbstractApplicationContext ja
  • 【C++】-- 哈希算法

    目录 一 哈希概念 1 插入和查找 2 哈希表 3 常见的哈希函数 1 直接定址法 2 除留余数法 二 用闭散列解决哈希冲突 1 线性探测法介绍 2 线性探测的实现 1 状态 2 定义HashData 3 哈希表 4 查找 5 插入 6 删
  • sparkStreaming:实时流数据详解

    目录 一 概述 二 wordCount示例 三 初始化StreamingContext 四 DStreams 离散数据流 五 输入DStream和接收器 Basic sources File Streams Custom Receivers
  • js 实现鼠标点击tab栏选项卡切换,下面相应内容跟随变化

  • Github上 简单易用的 Android ViewModel Retrofit框架

    RequestViewModel 长期更新 支持网络请求的ViewMode框架 ViewModel LiveData Retrofit github 地址 https github com miaotaoii RequestViewMode