Github简单易用的 Android ViewModel Retrofit框架

目录
  • RequestViewModel
  • Gradle
  • 使用
    • 1.retrofit接口的声明
    • 2.retrofit配置
    • 3.在Activity或Fragment中创建请求对象
    • 4.继承RequestLiveData,处理返回数据
    • 5.使用RequestViewModel和RequestLiveData请求数据
    • 6.设置请求参数,主动请求数据
    • 7.观察RequestLvieData数据变化
    • 8.日志打印

RequestViewModel

优势:

  • 快捷、方便地使用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.使用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 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Retrofit框架的使用

    Retrofit介绍 Retrofit是Square开源的一款基于OkHttp(也是他家的)封装的网络请求框架,主要的网络请求还是OkHttp来完成,Retrofit只是对OkHttp进行了封装,可以让我们更加简单方便的使用,目前大部分公司都在使用这款框架,Retrofit的原理也是面试必问的问题之一了,所以我们不仅要会使用,也要对其实现原理有一个大概的了解. 本片文章从使用角度来说,不对的地方希望大家在评论区交流,我会及时改进,共同进步,文章中的demo可以从github下载. Retrofi

  • Android Jetpack架构组件 ViewModel详解

    前言 前面两篇文章我们已经学习了Lifecycle和DataBind,本篇文章我们来学习Jetpack系列中比较重要的ViewModel,Jetpack的很多很多组件都是搭配使用的,所以单独的知识点可能会有些"无意义"但却是我们项目实战的基础! ViewModel的使用 ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据.ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在.这句话很好理解,还记得我们在讲解Lifecycle的时候 举的例子吗,我们还是使用那

  • Android-ViewModel和LiveData使用详解

    ViewModel类的设计目的是以一种关注生命周期的方式存储和管理与UI相关的数据. 例如:Activity在配置发生改变时(屏幕旋转),Activity就会重新创建,onCreate()方法也会重新调用.我们可以在onSaveInstanceState()方法中保存数据,并从onCreate()方法中通过Bundle恢复数据,但这种方法只适用于可以对其进行序列化的少量数据,而不适用于潜在的大量数据.使用ViewModel的话ViewModel会自动保留之前的数据并给新的Activity或Fra

  • 解决android viewmodel 数据刷新异常的问题

    3年的wpf开发经验,自认为对数据驱动UI开发模式的使用不是问题,但当开始研究android的mvvm模式开发时,发现两年多的android开发经验已经将之前的wpf开发忘得7788了.感慨一下:人老了,记忆力就这么脆弱. 谈正题:adroid mvvm开发模式 之 viewmodel使用小麻烦. viewmodel public class MyViewModel extends ViewModel { private MutableLiveData<List<User>> mU

  • Android通过ViewModel保存数据实现多页面的数据共享功能

    通过ViewModel实现的数据共享符合Android的MVC设计模式,将数据独立出来 实现的Demo 1.主页面通过SeekBar 来改变数字的值 2.点击进入就进入第二个界面,但是数据还是共享的 3.随便加两个数字上去,再次切换 4.发现数据还是共享的 下面是具体实现步骤: 1.建立两个Fragment(使用了Binding 和 Navigation) 一点要添加Binding 和 Navigation 不然做不了 2.建立一个继承于ViewModel的类 3.分别在两个Fragment的代

  • Android ViewModel的使用总结

    目录 基本使用 MainRepository MainViewModel MainActivity ViewModel 相关问题是高频面试题.主要源于它是 MVVM 架构模式的重要组件,并且它可以在因配置更改导致页面销毁重建时依然保留 ViewModel 实例. 看看 ViewModel 的生命周期 ViewModel 只有在正常 Activity finish 时才会被清除. 问题来了: 为什么Activity旋转屏幕后ViewModel可以恢复数据 ViewModel 的实例缓存到哪儿了 什

  • Android使用Retrofit上传文件功能

    本文实例为大家分享了Android使用Retrofit上传文件的具体代码,供大家参考,具体内容如下 一.封装RetrofitManager public class RetrofitManager {     private static RetrofitManager retrofitManager;          private Retrofit retrofit;     private RetrofitManager() {}     public static RetrofitMa

  • android Retrofit2网络请求封装介绍

    目录 1. Retrofit使用 2. Retrofit封装 3. RetrofitUtil使用 最后 1. Retrofit使用 Retrofit是一个现在网络请求框架,先来说一下怎么使用 网络权限(添加到AndroidManifest.xml) <uses-permission android:name="android.permission.INTERNET" /> gradle依赖(添加到build.gradle) implementation("com.

  • Android使用 Coroutine + Retrofit打造简单的HTTP请求库

    基于 kotlin/coroutine/retrofit/jetpack 打造,100来行代码,用法超级简单舒适 设置默认Retrofit工厂和全局错误处理程序 HttpCall.init(retrofitFactory = { // ... }, errorHandler = { throwable -> // ... }) 基本用法 data class Reault(val data:String) interface TestService { @GET("test")

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

    目录 RequestViewModel Gradle 使用 1.retrofit接口的声明 2.retrofit配置 3.在Activity或Fragment中创建请求对象 4.继承RequestLiveData,处理返回数据 5.使用RequestViewModel和RequestLiveData请求数据 6.设置请求参数,主动请求数据 7.观察RequestLvieData数据变化 8.日志打印 RequestViewModel 优势: 快捷.方便地使用ViewModel .LiveData

  • [Alibaba-ARouter]浅谈简单好用的Android页面路由框架

    开发一款App,总会遇到各种各样的需求和业务,这时候选择一个简单好用的轮子,就可以事半功倍 前言 Intent intent = new Intent(mContext, XxxActivity.class); intent.putExtra("key","value"); startActivity(intent); Intent intent = new Intent(mContext, XxxActivity.class); intent.putExtra(&

  • Android中网络框架简单封装的实例方法

    Android中网络框架的简单封装 前言 Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能.访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库.由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架.如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做. 封装网络框架 在架构设计中,面向接口和抽象,

  • Android开发Retrofit源码分析

    目录 项目结构 retrofit 使用 Retrofit #create ServiceMethod #parseAnnotations HttpServiceMethod#parseAnnotations 第二种 非Kotlin协程情况 DefaultCallAdapterFactory#get 第一种 Kotlin协程情况 总结 项目结构 把源码 clone 下来 , 可以看到 retrofit 整体结构如下 图 http包目录下就是一些http协议常用接口 , 比如 请求方法 url ,

  • 简单易用的倒计时js代码

    <!doctype html> <html> <head> <meta charset="utf-8"> <title>简单易用的倒计时js代码</title> <style> *{ margin:0; padding:0; list-style:none;} body{ font-size:18px; text-align:center;} .time{ height:30px; padding:20

  • 简单易用的基于jQuery版仿新浪微博向下滚动效果(附DEMO)

    简单易用的jQuery 写的仿新浪微博 向下滚动效果 $(function(){ var scrtime; $("#con").hover(function(){ clearInterval(scrtime); },function(){ scrtime = setInterval(function(){ var $ul = $("#con ul"); var liHeight = $ul.find("li:last").height(); $u

  • 基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <script> (function () { var tian = document.getElementsByClassName('JS-tian')[0]; var shi = document.getElementsByClassName('JS-shi')[0]; var fen = document.getElementsByClassName('JS-fen')[0]; var miao = document.getEleme

  • JS实现简单易用的手机端浮动窗口显示效果

    本文实例讲述了JS实现简单易用的手机端浮动窗口显示效果.分享给大家供大家参考,具体如下: html: <style type="text/css"> .fdBonTel{ width:100%; height:53px; position:fixed; background:#0052ae; text-align:center; left:0; bottom:0; z-index:999; } .fdOnline{ background:url(index/images/o

随机推荐