android:Retrofit2网络请求封装

RxJava + Retrofit2.0的项目实战完美封装 Retrofit 和RxJava已经出来很久了,从去年开始rxjava和retrofit就开始火,所以之前在做项目的时候也用了rxjava和retrofit,今天就介绍一下在项目中如何封装rxjava和retrofit。对于 RxJava 不是很了解的同学推荐你们看这篇文章给 Android 开发者的 RxJava 详解。Retrofit的使用可以看看Android Retrofit 2.0使用。首 阅读详情

1. Retrofit使用

Retrofit是一个网络请求框架,先来说一下怎么使用

  • 网络权限(添加到AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />
  • gradle依赖(添加到build.gradle)
    implementation("com.squareup.okhttp3:okhttp:4.9.2")
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
  • 定义接口,网络请求的方法
public interface Request {

    @GET("/xx/xx")
    Call<ResponseBody> get();

}
  • 实例化Retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("BASE_URL").build();
  • 通过Retrofit实例创建接口服务对象
Request request = retrofit.create(Request.class);
  • 调用接口中的方法
Call<ResponseBody> call = request.get();
  • 执行异步请求(同步请求需要创建一个新的线程去执行)
call.enqueue(new retrofit2.Callback<ResponseBody>() {
            @Override
            public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {

            }

            @Override
            public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {

            }
});

2. Retrofit封装

以上可以看出Retrofit是个好东西,可是用起来是比较麻烦的,所有在实际使用中对Retrofit进行一下小小的封装是很有必要的。

  • 定义接口(所有的请求参数都是以map的形式)
public interface Request {

    /**
     * 不带参数的get请求
     * @param url
     * @return
     */
    @GET()
    Call<ResponseBody> get(@Url String url);

    /**
     * 带参数的get请求
     * @param url
     * @param map 参数默认是map
     * @return
     */
    @GET()
    Call<ResponseBody> get(@Url String url, @QueryMap Map<String,String> map);

    /**
     * 不带参数的post请求
     * @param url
     * @return
     */
    @POST()
    Call<ResponseBody> post(@Url String url);

    /**
     * 带参数的post请求
     * @param url
     * @param map
     * @return
     */
    @POST()
    @FormUrlEncoded
    Call<ResponseBody> post(@Url String url, @FieldMap Map<String,String> map);

    
}
  • 定义RetrofitManager,以单例模式获取Retrofit实例
public enum RetrofitManager {

    /**
     * RetrofitManager的实例
     */
    INSTANCE;

    /**
     *
     * 后端接口的baseUrl,且只考虑一个url的情况(ip+端口,或者域名)
     */
    private static final String BASE_URL = " Your BASE_URL";

    private Retrofit retrofit;

    /**
     * 返回Retrofit实例,不添加转换器
     * @return
     */
    public Retrofit getRetrofit(){
        if(retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .build();
        }
        return retrofit;
    }
}
  • 自定义的RetrofitCallback,在发送请求时,通过匿名对象作为参数获取后端的响应结果。
public abstract class RetrofitCallback {


    /**
     * 开始执行的方法
     */
    public void onStart(){
        //开启loading
    }

    /**
     * 结束执行的方法
     */
    public void onCompleted(){
        //关闭loading
    }

    /**
     * 执行成功
     * @param resultJsonString  返回的json字符串
     */
    public abstract void onSuccess(String resultJsonString);

    /**
     * 失败
     * @param t 异常
     */
    public abstract void onError(Throwable t);

    /**
     * 提示:服务异常
     */
    public void serverErrMsg(){
        //xxx
    }

    /**
     * 提示:请求失败
     */
    public void reqErrMsg(){
        //xxx
    }


    /**
     * 提示:成功
     */
    public void okMsg(){
        //xxx
    }

}
  • 定义RetrofitUtil,封装get和post方法。将RetrofitCallback作为请求参数,在发送请求时重写onSuccess和onError方法,执行具体的操作。
public class RetrofitUtil {

    private Retrofit(){}

    /**
     * 无参的get请求
     * @param url
     * @param callback
     */
    public static void get(String url, RetrofitCallback callback){
        sendRequest(getRequest().get(url),callback);
    }

    /**
     * 有参的get请求
     * @param url  请求的url
     * @param map  参数
     * @param callback  请求结束的回调
     */
    public static void get(String url, Map<String,String> map, RetrofitCallback callback){
        sendRequest(getRequest().get(url,map),callback);
    }

    /**
     * 无参的post请求
     * @param url
     * @param callback
     */
    public static void post(String url, RetrofitCallback callback){
        sendRequest(getRequest().post(url), callback);
    }

    /**
     * 有参的post请求
     * @param url
     * @param map
     * @param callback
     */
    public static void post(String url, Map<String,String> map, RetrofitCallback callback){
        sendRequest(getRequest().post(url,map), callback);
    }


    /**
     * 获取Request实例
     * @return
     */
    private static Request getRequest(){
        Retrofit retrofit = RetrofitManager.INSTANCE.getRetrofit();
        return retrofit.create(Request.class);
    }

    /**
     * 发送请求的共通方法,并对响应结果进行处理
     * @param call
     * @param callback 自定义的Callback
     */
    private void sendRequest(Call<ResponseBody> call,RetrofitCallback callback){

        //开启loading
        callback.onStart();
        //异步请求
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                //关闭loading
                callback.onCompleted();
                if(response.isSuccessful()){
                    //执行RetrofitCallback的onSuccess方法,获取响应结果的json字符串
                    try {
                        String result = response.body().string();
                        callback.onSuccess(result);
                        //响应成功
                        if(StringUtils.equals(result, Constant.SUCCESS)){
                            callback.okMsg();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }else{
                    //服务异常
                    callback.serverErrMsg();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                callback.onCompleted();
                //请求失败
                callback.onError(t);

                callback.reqErrMsg();
               }
            }
        });
    }
}

3. RetrofitUtil使用

get无参请求

RetrofitUtil.get("/xx/xx", new RetrofitCallback() {
    @Override
    public void onSuccess(String resultJsonString) {
                
    }

    @Override
    public void onError(Throwable t) {

    }
});

get有参请求

Map<String,String> map = new HashMap<>(16);
map.put("key","value");
//xxx
RetrofitUtil.get("/xx/xx", map,new RetrofitCallback() {
    @Override
    public void onSuccess(String resultJsonString) {
        xxxx
    }

    @Override
    public void onError(Throwable t) {
        xxxx
    }
});

post请求和get的使用方法相似

3. 最后

本次只对get和post进行了封装,项目中只用到了这些就没有对文件上传下载以及别的请求方式进行封装。且没有添加转换器,可在RetrofitManager的getRetrofit()方法中自行添加。大概的封装思路就是这样的,可以自行发挥。

此文也只是在记录项目中对Retrofit的使用,对Retrofit的原理并没有较深的了解。

不足之处、欢迎留言。

感谢:对以下大佬的文章进行过参考,特此感谢

Android网络框架Retrofit2使用封装:Get/Post/文件上传/下载

Retrofit的封装

Android实现Rxjava2+Retrofit完美封装,苦熬一个月 对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。 阅读详情

相关推荐

Android网络请求终极指南:Retrofit2与OkHttp深度解析与实战封装

Android网络请求深度解析与实战:Retrofit2与OkHttp最佳实践 本文全面剖析了Android开发中最主流的网络请求组合Retrofit2+OkHttp的核心机制与实战应用。首先明确了二者的职责边界:OkHttp作为底层执行者处理TCP连接、拦截器链等网络基础功能,而Retrofit则负责上层接口定义和请求组织。文章深入解析了Retrofit的动态代理、Converter数据转换和CallAdapter适配机制,以及OkHttp的拦截器链、连接池等核心特性。提供了一套完整的Kotlin实战封装

dongdeaiziji的专栏 200

Retrofit2 实战

Retrofit2 实战

Hh19900902的博客 984

RxJava2+Retrofit+RxBus+OkHttp3+lifecycle封装 实现所有请求

RxHttp 本框架 是对 RXJAVA2 + Retrofit + OkHttp3 + lifecycle的架构的封装 1.采用链式调用一点到底 2.支持动态配置和自定义Okhttpclient,支持okhttp自定义cookie管理 3.支持多种方式访问网络GET、POST、PUT、DELETE等请求协议 4.支持网络缓存,以及本地缓存,七种缓存策略可选 5.支持固定添加header和动态添加...

不凡的路 453

Retrofit2框架封装(源码+java)

【代码】Retrofit2框架封装(源码+java)

唐诺 982

【安卓】rxjava2+retrofit封装处理网络请求全解析

使用rxjava2+retrofit处理网络请求,线程的切换变得十分简单,代码也简洁了很多。但是简介的代码就是对可扩展性有着负面的影响,所以要对rxjava2+retrofit进行一定封装,使结构更清晰,可扩展性更强。这里给出一种可行的封装。 以下均以登陆请求为例子。 API地址:http://xxx/user/login Post请求,参数account和password均为String ...

Zoom 3062

高德天气应用开发之十:android retrofit2&okhttp3&Gson 网络请求框架 封装和使用

【版权说明】 1. 请支持原创,转载请注明出处:https://blog.youkuaiyun.com/cbk861110/article/details/86665564 2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正)...

caobaokang的专栏 1289

android okhttp网络请求的封装_Android网络框架系列: Retrofit2.5

引言 Retrofit是Square公司开发的一款针对Android网络请求的框架,遵循Restful设计风格,我们查看 invoke 可以发现:底层基于OkHttp实现的 ,相比其他网络请求框架,有以下优势:性能最好,速度最快(动态代理优势)简洁易用,代码简化解耦彻底,职责细分易与其他框架联用(Rxjava)当然也有弊端:因为高度封装,相对于 OkHttp ,扩展性变差了,不过整体能满足项目需...

weixin_36168996的博客 171

Android实战——Retrofit2的使用和封装

Android实战——Retrofit2的使用和封装

Android网络请求框架-Volley、OkHttp、Retrofit

1. Volley              Volley是2013年Google官方发布的一款Android平台的网络请求框架,Volley是“群发”、“迸发”,因此它非常适合 一些数据量不大,但需要频繁通信的网络操作。 优点: Volley框架封装了HttpClient,可以提供开发效率; 而且性能稳定性很高; 而且扩展性较强,支持HttpClient、HttpUrlConnnect...

牛八少爷的专栏 657

BCIC IV 2a数据集实战:从MATLAB导入到EEG信号分析全流程

本文提供了BCIC IV 2a数据集从MATLAB导入到EEG信号分析的完整实战流程。详细解析了数据集结构,区分了EEG与EOG信号,并演示了信号可视化、基础预处理(滤波、分段、基线校正)等关键步骤,帮助脑机接口研究者快速上手处理这一经典运动想象数据集。

weixin_29047919的博客 467

Hypermesh二次开发实战:从Tcl/Tk脚本到Ext API的进阶之路

本文系统介绍了Hypermesh二次开发的进阶路径,从自动化重复操作的Tcl/Tk脚本入门,到利用HMASCII接口深度读写模型数据,最终深入Ext API进行高性能计算与功能定制。通过实战案例,帮助工程师掌握从脚本录制到C++插件开发的完整技能,显著提升CAE前处理效率与自动化水平。

weixin_29306875的博客 667

Android网络框架Retrofit2使用封装:Get/Post/文件上传/下载

Android网络框架Retrofit2使用封装:Get/Post/文件上传/下载

木鱼wzh的博客 564

OSGEarth三维可视化避坑指南:如何高效加载SHP/TIF地理数据?

本文详细介绍了OSGEarth在三维地球可视化中高效加载SHP/TIF地理数据的实战策略,包括空间参考系配置、性能优化、二三维联动等关键技巧。通过具体案例和代码示例,帮助开发者解决坐标偏移、性能卡顿等常见问题,提升三维GIS开发效率。

weixin_29216957的博客 221

Kotlin + 协程 + Retrofit + MVVM优雅的实现网络请求

  前言   最近一直在修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。这次使用到的是 协程+ retrofit +mvvm的模式,我这儿直接用一个简单的demo来看一下具体的实现方式吧。文章只是描述实现思路,需要demo的直接跳到文末。   项目配置   首先先引入...

weixin_30924239的博客 448

单细胞测序数据整合

基于Seurat 联合harmony进行单细胞数据整合分析

G2530051386的博客 9789

2026从0到1!C#工控机开发实战指南:新手一周就能跑通的完整项目

这篇文章摘要如下: 工业自动化领域工控机开发入门指南,针对零基础开发者提供从环境搭建到项目实战的全流程指导。文章首先解答工控机开发的3个核心问题,比较工控机与普通PC的区别,推荐使用C#作为开发语言。随后详细讲解开发环境配置、四大核心技术栈(通信协议、数据库、UI框架、多线程),并重点演示Modbus TCP通信的实现。最后通过一个完整的温度监控系统项目实战,展示如何用WPF构建实时数据采集界面,包括Modbus通信类编写、数据采集服务实现等关键代码片段。全文采用图解+代码的方式,帮助开发者快速掌握工控系统

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 698

Retrofit2配合RxJava实现网络请求并简易封装

搭建这个简单网络请求框架可以大概分为以下步骤: 基础准备; 创建接口类; 创建OkHttp3实例; 创建retrofit实例; 创建调用器,将Java接口修改为HTTP调用; 封装回调观察者,统一处理错误信息。 第一步的基础准备自然就是添加需要的依赖了,根据版本自己选择,通常使用最新版: implementation 'io.reactivex.rxjava2:rxjav...

FooTyzZ 439

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4554

【Android】RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

前言: 近些年很火的Retrofit+RxJava+OkHttp网络请求框架,功能强大,结构合理,使用简单方便。后面还会给大家发自己整理过的Retrofit和RxJava、RxAndroid和RxBus。希望大家点一下关注,让我这个懒癌患者有动力继续写下去! 本篇分三个部分:基础篇、封装篇和自己项目使用篇,项目是自己公司的APP...

贵公子丶笔记 3393

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5381

以 Cloud 为核心的设备 mTLS 证书体系:从产品需求到 OP-TEE 安全落地

本文探讨了以云端为核心的物联网设备mTLS证书体系构建方案。文章从产品需求出发,分析了云端必须采用mTLS+证书体系管理设备身份的原因,指出静态Token方案的三大缺陷:身份不可控、运营不可控和审计不可控。重点阐述了mTLS在产品中的核心功能是加密传输和双向认证,并详细列出了云端PKI、设备注册中心等必备组件。在设备侧,强调必须通过OP-TEE技术保护私钥安全,提出了一个包含密钥生成、CSR导出等功能的TA设计方案。最后,文章给出了云端端到端流程示例,说明如何将证书生命周期管理转化为可运营的产品能力,包括自

Interview_TC的博客 637

Android Rxjava+Retrofit网络请求框架封装(二)

一、前言 二、BaseResponse与BaseObserver的封装 三、RxHelper调度类封装 四、Retrofit初始化封装 五、细节完善 1、服务错误信息处理 2、添加“正在加载”弹窗 3、Retorfit请求方法汇总 4、提交参数方式汇总(可忽略) 六、总结 七、Demo地址 八、内容推荐 一、前言 由于《Rxjava+Retrofit网络请求框架封装...

斌林诚上的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android Rxjava+Retrofit网络请求框架封装(一)

目录 一、简介 二、Retrofit基本使用 (1)在build文件中加入相关依赖 (2)基本使用 (3)测试 三、Retrofit 自定义的OkHttpClient (1)设置自定义的OkHttpClient (2)Retrofit 添加client (3)打印效果 四、Retrofit 与 Rxjava 结合使用 (1)添加依赖 (2)Retrofit 设置 (3...

斌林诚上的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

android okhttp+RxJava+retrofit网络请求框架封装

android okhttp+RxJava+retrofit网络请求框架封装 android开发中,网络请求是必不可少的开发模块,所以对于网络请求的框架和封装在开发中就显得尤为重要,今天我这里就大概的描述下okhttp+rxJava+retrofit三者相结合网络请求的封装 一.okhttp+RxJava+Retrofit请求框架集成 在app的build.gradle中加入如下依赖 im...

cangahi09025566的博客 5847

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Android 进阶】Retrofit2 目前最优雅的网络请求框架

身为Geek的我们,面对不断更新换代的技术是不是有点感到迷茫呢?其实只要掌握正确的学习方法,新的技术也就不畏惧了。 福利来了 推荐一位大牛【人称:面哥】呕心沥血的一篇经验分享: 程序员之路-学习经验总结分享 正是面哥的鞭策,我决定开始看英文的技术文档,学习新技术也是直接看官网的技术文档,本篇文章就是我在Retrofit2的官网看完英文文档Retrofit之后写的翻译版本。希望对英文不是很好的

Veyron_wu 9312

Retrofit网络请求二次封装

(之前用过Any,但是后端返回的数据格式有时候会不一样,有可能是Boolean,String,或者就是个列表,并不是一个json,所以后面我换成了JsonElement)App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。网络请求在App开发中是不可避免的开发功能点,Android自带的ottp用于网络请求,于是便衍生了各种便捷的网络请求三方库。retrofit的网络请求的工作本质上是。

Android 领域开发程序员,希望通过写博客的方式不断的总结提升自己,大家共同进步哦! 978
上一篇: 异常:com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:sqlserver://
下一篇: android:震动的实现
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值