Android 网络请求框架,简单易用,so easy

Overview

简单易用的网络框架

集成步骤

  • 在项目根目录下的 build.gradle 文件中加入
buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  • 在项目 app 模块下的 build.gradle 文件中加入
android {
    // 支持 JDK 1.8
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // 网络请求框架:https://github.com/getActivity/EasyHttp
    implementation 'com.github.getActivity:EasyHttp:10.2'
    // OkHttp 框架:https://github.com/square/okhttp
    // noinspection GradleDependency
    implementation 'com.squareup.okhttp3:okhttp:3.12.13'
}

框架的具体用法请点击这里查看

不同网络请求框架之间的对比

功能或细节 EasyHttp Retrofit OkGo
对应版本 10.2 2.9.0 3.0.4
issues 数
aar 包大小 76 KB 123 KB 131 KB
minSdk 要求 API 14+ API 21+ API 14+
配置多域名
动态 Host
全局参数
日志打印
超时重试
请求缓存
下载校验
极速下载
批量上传文件
上传进度监听
Json 参数提交
请求代码定位
延迟发起请求
分区存储适配
上传文件类型 File / FileContentResolver
InputStream / RequestBody
RequestBody File
请求生命周期 自动管控 需要封装 需要封装
参数传值方式 字段名 + 字段值 参数名 + 参数值 定义 Key + Value
框架灵活性
框架学习成本
API 记忆成本
接口维护成本
框架维护状态 维护中 维护中 停止维护
  • Retrofit 在我看来并不是那么好用,因为很多常用的功能实现起来比较麻烦,动态 Host 要写拦截器,日志打印要写拦截器,就连最常用的添加全局参数也要写拦截器,一个拦截器意味着要写很多代码,如果写得不够严谨还有可能出现 Bug,从而影响整个 OkHttp 请求流程,我经常在想这些功能能不能都用一句代码搞定,因为我觉得这些功能是设计框架的时候本应该考虑的,这便是我做这个框架的初心。

  • OkGo 其实也存在一些弊端,例如会把参数的 key 引用放到外层去,这样会引发一些问题:

    1. Key 管理问题:这个 key 可能会在外层被使用很多次,这样参数的 key 管理就会变得不可控,后续接口改动可能会出现漏改的风险,尽管这种情况比较少见,但是也不容忽视,而 EasyHttp 没有这个问题,因为 EasyHttp 不会将参数 key 值放置到外层中去。

    2. 接口参数注释的问题:站在代码的规范角度上讲,我们应该在代码中注明参数的含义及作用,如果一旦将 key 放到外层,那么每一处调用的地方都需要写一遍注释,而 EasyHttp 是将参数字段化,只需要写一次注释到字段上即可。

    3. 接口信息完整信息展示:使用 OkGo 请求网络,只能在调用的地方看到传递的接口参数,而一些被其他地方引用的参数,我们无法很直观的看到,只能通过追踪代码或者查看文档来得知,而 EasyHttp 将一个接口的信息全部通过一个类来管理的,这个类其实就相当于一个接口文档。

    4. 接口的动态化配置:除了接口的参数之外,一个接口还有可能单独配置 OkHttpClient 对象、参数的提交方式、接口响应处理方式等,这些用 OkGo 是可以实现,但是每个地方都要写一次,而 EasyHttp 可以直接在 API 类中配置,真正做到一劳永逸。

  • EasyHttp 采用了 OOP 思想,一个请求代表一个对象,通过类继承和实现的特性来对接口进行动态化配置,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。而 Retrofit 采用的是注解方式,缺点是灵活性极低,因为注解上面只能放常量,也就会限定你在注解上面的一切参数只能是事先定义好的,这对接口的动态化配置极不利的。

  • 有很多人觉得写一个接口类很麻烦,关于这个问题我后面已经想到一个好方案了,大家可以将 Api 类和 Bean 类写在一起,这样大家就不需要多写一个类了,具体写法示例如下:

public final class XxxApi implements IRequestApi {

    @Override
    public String getApi() {
        return "xxx/xxx";
    }
    
    private int xxx;

    public XxxApi setXxx(int xxx) {
        this.xxx = xxx;
        return this;
    }

    ......

    public final static class Bean {

        private int xyz;

        public int getXyz() {
            return xyz;
        }

        ......
    }
}
  • 是不是很机智?这样不仅很好地解决了这一问题,还能将一个接口所有的信息都包裹在这个类中,非常直观,一览如云,妥妥的一箭双雕。

生命周期自动管控介绍

  • 框架可以自动管控请求的生命周期,无需第三方调用者封装和适配,这块其实用到 Jetpack 中的一个 Lifecycle 特性,框架将网络请求和 LifecycleOwner 绑定在一起,当 LifecycleOwner 触发 destroy 时,框架会对绑定的网络请求进行 cancel 处理。相比较传统的写法,这种方式更加简单快捷,同时有 Lifecycle 特性的加持,灵活也会更高,因为我们完全不需要关心请求的主体是 Activity 还是 Fragment,又或者是其他类型的对象。

  • 但并不是完全没有缺点,因为 Lifecycle 特性是 AndroidX 包中的新特性,如果需要使用的话,当前项目必须基于 AndroidX 库开发的才可以集成。

  • 都说代码是最好的老师,具体实现的代码如下:

public final class HttpLifecycleManager implements LifecycleEventObserver {

    /**
     * 绑定组件的生命周期
     */
    public static void bind(LifecycleOwner lifecycleOwner) {
        lifecycleOwner.getLifecycle().addObserver(new HttpLifecycleManager());
    }

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        if (event != Lifecycle.Event.ON_DESTROY) {
            return;
        }

        // 移除监听
        source.getLifecycle().removeObserver(this);
        // 取消请求
        EasyHttp.cancel(source);
    }
}

极速下载功能介绍

  • 其实本质上面和极速秒传的原理是差不多的,只不过一个是上传,另一个是下载。而极速上传是将本地文件的 MD5 值和服务器上面的进行比对,如果服务器存在这个 MD5 值的文件,就将这份文件映射一份到这个用户的网盘上面,从而达到了极速秒传的效果。而极速下载也是同理,根据后台给的文件 MD5 值和本地文件进行对比,如果存在这个文件并且 MD5 值一致,证明这个文件和服务器上面的文件是一致的,那么就直接跳过下载,直接回调下载成功监听。

  • 极速秒传和极速下载两者相同的共同点就是,利用缓存来达到极速的效果,只不过一者通过的是服务器的缓存,另一者使用的是本地的缓存,这两者都有一个共同的特点,就是减少服务器的压力,节省用户的等待时间。

代码定位功能介绍

  • 框架会在日志打印中输出在网络请求的代码位置,这样开发者可以直接通过点击 Log 来定位代码是在哪个类哪行代码,这样可以极大提升我们排查问题的效率,特别是在请求一多且业务复杂的情况下,我相信没有一个人会拒绝这样的功能。

延迟发起请求功能介绍

  • 通常我们都有这样一种需求,就是我们希望发起网络请求,但是希望它不是及时,而是经过一定的延迟才去请求,EasyHttp 针对这种场景进行了考虑并封装,我们可以这样写来做到这种效果:
EasyHttp.post(this)
        .api(new XxxApi())
        .delay(3000)
        .request(new HttpCallback<HttpData<XxxBean>>(this) {

            @Override
            public void onSucceed(HttpData<XxxBean> result) {
                
            }
        });
  • 延迟请求功能不仅支持同步和异步请求,还支持下载请求延迟。

作者的其他开源项目

微信公众号:Android轮子哥

Android 技术分享 QQ 群:78797078

如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 🐵 就太 👍 了。您的支持将鼓励我继续创作:octocat:

点击查看捐赠列表

特别感谢

License

Copyright 2019 Huang JinQun

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • 下载文件时(post请求),接口出现校验出错的情况,依然返回一个file

    下载文件时(post请求),接口出现校验出错的情况,依然返回一个file

    问题描述

    • 框架版本【必填】:11.2

    • 问题描述【必填】:当接口返回的数据并不是一个file(json)时,该框架依然当做file文件下载下来

    • 复现步骤【必填】:

    • EasyHttp.download(ApplicationLifecycle.getInstance()) .method(HttpMethod.POST) .file(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+Constants.FILE_PATH_IMG,"childName" )) .url("...") .listener(new OnDownloadListener() {

                           @Override
                           public void onStart(File file) {
                               Log.d("Status","onStart");
      
                           }
      
                           @Override
                           public void onProgress(File file, int progress) {
                               Log.d("Status","onProgress");
                           }
      
                           @Override
                           public void onComplete(File file) {//下载完成
                               Log.d("Status","onComplete");
                               //不管接口出现什么问题,都会走到这里并且,比如接口返回{code:500,msg:"请求出错"},依然会当做文件下载, 
                              //修改后缀为TXT后打开即这个json的内容
      
                           }
      
                           @Override
                           public void onError(File file, Exception e) {
                               Log.d("Status","onError");
                           }
      
                           @Override
                           public void onEnd(File file) {
                               Log.d("Status","onEnd");
                           }
      
                       }).start();
      
    • 是否必现【必填】:是

    • 出现问题的手机信息【必填】:任意手机

    • 出现问题的安卓版本【必填】:任意版本

    请回答

    • 是部分机型还是所有机型都会出现【必答】:全部

    • 框架最新的版本是否存在这个问题【必答】:是)

    • 是否已经查阅框架文档还未能解决的【必答】:是

    • issue 是否有人曾提过类似的问题【必答】:否

    • 是否可以通过 Demo 来复现该问题【必答】:是)

    • 这个问题是不是后台自己的问题导致的【必答】:否,虽然是下载文件,但是出错情况并不是返回一个文件

    bug 
    opened by Brislis 13
  • 一些看法

    一些看法

    你说Retrofit的一些缺点,我是认同的。但是你说的维护性其实是不认同的。 一,Retrofit不支持动态参数修改是个败笔,但是一个接口一个类的时代已经过去了,真的不建议再弄回来。与其造轮子,不如写个类似Retrofit的库,开放出动态修改参数这样的功能即可。 二,下载的功能着实有些鸡肋,没有贬低的意思,网络请求就好好做网络请求就好了。

    opened by daiwj 11
  • 上传文件,文件名(中文)变乱码

    上传文件,文件名(中文)变乱码

    问题描述

    • 框架版本:10.8

    • 问题描述:文件上传,服务端接收到的文件名(中文)变成乱码。备注:有个特殊的点,就是此文件是来自外挂u盘里的而非手机存储里的。不清楚会不会是这个导致了乱码。

    • 复现步骤:XXX

    • 是否必现:是

    • 出现问题的手机信息:红米k30s

    • 出现问题的安卓版本:12(miui13.0.4)

    请回答

    • 是部分机型还是所有机型都会出现:全部

    • 框架最新的版本是否存在这个问题:是

    • 是否已经查阅框架文档还未能解决的:是

    • issue 是否有人曾提过类似的问题:否

    • 是否可以通过 Demo 来复现该问题:是

    • 这个问题是不是后台自己的问题导致的:否(同一个上传接口也有web端在请求,但就不会乱码)

    其他

    • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)

    • 提供截图或视频(根据需要提供,此项不强制)

    • 提供解决方案(如果已经解决了的话,此项不强制)

    bug 
    opened by JiangShuLiang 10
  • isBeanType对Null的判断问题

    isBeanType对Null的判断问题

        /**
         * 判断对象是否为 Bean 类
         */
        public static boolean isBeanType(Object object) {
            // Number:Long、Integer、Short、Double、Float、Byte
            // CharSequence:String、StringBuilder、StringBuilder
            return !(object instanceof Number || object instanceof CharSequence ||
                    object instanceof Boolean || object instanceof File ||
                    object instanceof InputStream || object instanceof RequestBody ||
                    object instanceof Character || object instanceof JSONObject ||
                    object instanceof JSONArray);
        }
    

    这里如果传过来的参数是空也认为是对象,但实际上有时候是封装类型,只不过值为空而已。 所以当参数结构如下时:

    public class XXApi implements IRequestApi, Serializable {
        private String name;
        private Map<String, Object> params;
    

    如果往params里面添加一个值为null的属性时提交请求会报错。 异常代码:

    case JSON:
                            if (value instanceof List) {
                                // 如果这是一个 List 参数
                                params.put(key, EasyUtils.listToJsonArray(((List<?>) value)));
                            } else if (value instanceof Map) {
                                // 如果这是一个 Map 参数
                                params.put(key, EasyUtils.mapToJsonObject(((Map<?, ?>) value)));
                            } else if (EasyUtils.isBeanType(value)) {
                                // 如果这是一个 Bean 参数
                                params.put(key, EasyUtils.mapToJsonObject(EasyUtils.beanToHashMap(value)));
                            } else {
                                // 如果这是一个普通的参数
                                params.put(key, value);
                            }
                            break;
                        default:
    

    由于isBeanType的判断错误导致调用了beanToHashMap,而此时的value是null,所以就异常了。

    opened by Skqing 9
  • 父类和子类存在相同属性时解析报错

    父类和子类存在相同属性时解析报错

    implementation 'com.hjq:http:9.2'

    错误:

    class com.xxx.bean.XxxBean declares multiple JSON fields named createTime
        com.hjq.http.exception.HttpException: class com.xxx.bean.XxxBean declares multiple JSON fields named createTime
            at com.cloudwave.lvzaimo.http.model.RequestHandler.requestFail(RequestHandler.java:197)
            at com.hjq.http.callback.NormalCallback.onFailure(NormalCallback.java:61)
            at com.hjq.http.callback.BaseCallback.onResponse(BaseCallback.java:56)
            at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:923)
    

    为什么父类和子类存在相同属性呢,原本打算是通用属性放到父类,但因为用了greendao的库,greendao在保存对象的时候不会去读取父类的属性生成列因此只能在某个子类里加上跟父类相同的属性。但这有导致用'com.hjq:http:9.2'时报错。

    opened by Skqing 9
  • 缓存策略为USE_CACHE_FIRST能不能提供一个回调用来接收最新的数据

    缓存策略为USE_CACHE_FIRST能不能提供一个回调用来接收最新的数据

    【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

    建议收集

    • issue 是否有人曾提过类似的问题?【必答】无

    • 你觉得框架有什么不足之处?【必答】

    • 缓存策略为USE_CACHE_FIRST时,取到缓存就把回调置空了,这样就导致没办法及时拿到最新的数据去刷新界面了,建议不要把回调置空,或者新增一个回调,okgo里面就有类型的回调,onSuccess和onCacheSuccess

    • 你觉得该怎么去完善会比较好?【非必答】(你可以提供一下自己的想法或者做法供作者参考)

    help wanted 
    opened by w497763094 8
  • 我不想一个接口写一个类

    我不想一个接口写一个类

    建议收集

    • 你觉得框架有什么不足之处?(必答项,你可以描述框架有什么令你不满意的地方)

    • 缺少通用型操作

    • 你觉得该怎么去完善会比较好?(非必答项,你可以提供一下自己的想法或者做法供作者参考)

    • Net.api("/app/chargeEquip/sendCharge") .addParam("ckLabelId",equip.getCkLabelId()) .addParam("electricity",equip.getElectricity()) .addParam("ip",equip.getCabinetIp()) .addParam("place",msg.getPosition()+"") .addParam("time", TimeUtils.getNowString()) .addParam("type",msg.getType()+"") .callback(new Callback_base() { @Override public void onSuccess(Response response, String origin, Object o) {

                            }
                        });
      
    bug 
    opened by CPC-Coder 8
  • 紧急‼️,当请求参数,params(

    紧急‼️,当请求参数,params("",maps)时,服务器接收到的参数是[]的数组

    问题描述

    • 框架版本【必填】:v11.2

    • 问题描述【必填】:当请求参数,params("",maps)时

    • 复现步骤【必填】:请求参数 key传"",value传map

    • 是否必现【必填】:是

    • 出现问题的手机信息【必填】:模拟器

    • 出现问题的安卓版本【必填】:9

    请回答

    • 是部分机型还是所有机型都会出现【必答】:全部

    • 框架最新的版本是否存在这个问题【必答】:是

    • 是否已经查阅框架文档还未能解决的【必答】:是

    • issue 是否有人曾提过类似的问题【必答】:否

    • 是否可以通过 Demo 来复现该问题【必答】:是

    • 这个问题是不是后台自己的问题导致的【必答】:是,因为别的框架是好的

    其他

    • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)

    • 提供截图或视频(根据需要提供,此项不强制)

    • 提供解决方案(如果已经解决了的话,此项不强制)

    bug 
    opened by HeVTion 7
  • 上传文件失败,报 Stream Closed

    上传文件失败,报 Stream Closed

    问题描述

    • 框架版本:11.0

    • 问题描述: 上传一个11M的Mp4视频文件,进度百分百之后抛出Stream Close的异常

    • 复现步骤: 选择视频,调用接口上传

    • 是否必现:填是/否 是

    • 出现问题的手机信息:请填写出现问题的品牌和机型 HUAWEI MATE30 PRO

    • 出现问题的安卓版本:请填写出现问题的 Android 版本 Android9.0

    请回答

    • 是部分机型还是所有机型都会出现:部分/全部(例如:某为,某 Android 版本会出现) 目前手上的安卓设备都有这个问题(小米)
    • 框架最新的版本是否存在这个问题:是/否(如果用的是旧版本的话,建议升级看问题是否还存在) 是
    • 是否已经查阅框架文档还未能解决的:是/否(文档会提供最常见的问题解答,可以看看是否有自己想要的) 是
    • issue 是否有人曾提过类似的问题:是/否(看看曾经有人提过类似的问题,先参考一下别人是怎么解决的) 否
    • 是否可以通过 Demo 来复现该问题:是/否(排查一下是不是自己的项目代码写得有问题导致的) 是
    • 这个问题是不是后台自己的问题导致的:是/否(如果无法确定问题的原因,请先和后台开发人员协商联调,确认了问题是框架的再反馈给作者,如果是后台的问题作者也没用,最后还是要自己找后台处理才有用的) 应该不是,IOS上传正常

    其他

    • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来) 参数: 2022-06-13 10:52:45.186 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: RequestCode = (MainActivity.java:222) 2022-06-13 10:52:45.226 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: RequestUrl = xxxxxxx(为了隐私隐藏了,如果需要可以联系我) 2022-06-13 10:52:45.226 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: RequestMethod = POST 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: ---------------------------------------- 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: token = MTY1NTAxOTIzNw==.eyJwcmltYXJ5IjoyMDIyMDQyNSwidXNlcl9pZCI6MTY1MDg2ODk2MTUxNzAwMCwiZXhwaXJlX3RpbWUiOjE2NTUzNjQ4Mzd9.NzQzNmNjZDI4MDExNzc0NWUxMmVmMTNkZjc4NzZlYTljY2FiZDQ0MA== 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: timestamp = 1655088765187 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: ---------------------------------------- 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: area = "芜湖" 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: duration = "3539" 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: mtype = "3" 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: circle_id = "165501929246514" 2022-06-13 10:52:45.227 11499-12297/com.hjq.easy.demo I/EasyHttp CircleApi: file[0] = /storage/emulated/0/DCIM/Camera/VID_20220612_160410.mp4 报错: java.io.IOException: Stream Closed at java.io.FileInputStream.read(FileInputStream.java:306) at okio.InputStreamSource.read(Okio.kt:102) at okio.RealBufferedSink.writeAll(RealBufferedSink.kt:105) at com.hjq.http.body.UpdateBody.writeTo(UpdateBody.java:69) at okhttp3.MultipartBody.writeOrCountBytes(MultipartBody.java:173) at okhttp3.MultipartBody.writeTo(MultipartBody.java:114) at com.hjq.http.body.ProgressBody.writeTo(ProgressBody.java:62) at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:72) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:127) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:257) at okhttp3.RealCall$AsyncCall.execute(RealCall.java:201) at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:929) 2022-06-13 10:53:10.366 11499-12297/com.hjq.easy.demo E/EasyHttp CircleApi: 请求被中断,请重试 com.hjq.http.exception.CancelException: 请求被中断,请重试 at com.hjq.easy.demo.http.model.RequestHandler.requestFail(RequestHandler.java:168) at com.hjq.http.callback.NormalCallback.onFailure(NormalCallback.java:166) at com.hjq.http.callback.BaseCallback.onFailure(BaseCallback.java:93)

    • 提供截图或视频(根据需要提供,此项不强制) 参数 image 报错 image

    • 提供解决方案(如果已经解决了的话,此项不强制)

    bug 
    opened by thundeGG 7
  • java.lang.IllegalStateException: closed

    java.lang.IllegalStateException: closed

    问题描述

    • 框架版本:11.0

    • 问题描述:大佬,我在做文件上传时有个场景需要将返回的响应传给其他页面,因此设置 IRequestHandler 时直接返回了 Response, 但是当我在请求成功时调用 response.body()?.string() 即报错了,原因是该方法仅可被调用一次,具体代码可见截图。

    • 复现步骤:XXX

    • 是否必现:是

    • 出现问题的手机信息:荣耀20Pro

    • 出现问题的安卓版本:Android 10

    请回答

    • 是部分机型还是所有机型都会出现:未测试其他机型

    • 框架最新的版本是否存在这个问题:是

    • 是否已经查阅框架文档还未能解决的:是

    • issue 是否有人曾提过类似的问题:否

    • 是否可以通过 Demo 来复现该问题:否

    • 这个问题是不是后台自己的问题导致的:否

    其他

    • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)

    image

    • 提供截图或视频(根据需要提供,此项不强制)

    运行部分代码如下: image

    • 提供解决方案(如果已经解决了的话,此项不强制) 目前我看在 requestSucceed 成功中解析响应没有问题,因此可以在这里定义实体类进行接受转换,但是我目前的使用场景仅仅是上传文件时使用到,因此不想再去单独定义个基类去进行解析,请问大佬有好的解决方式吗?
    bug 
    opened by Heart-Beats 7
  • 请问easyhttp网络请求会被阻塞导致代码延迟执行吗?

    请问easyhttp网络请求会被阻塞导致代码延迟执行吗?

    【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

    问题描述

    • 请描述一下你的疑惑【必填】:XXX(注意:如果是框架 bug 请不要在这里提,否则一概不受理)

    我这里查看现场安卓终端设备日志,发现 EasyHttp.post(this).api(xxx).request()代码没有立即执行,http的拦截器日志在稍后几分钟才进行打印。感觉像是被阻塞了?也怀疑是硬件出了问题。已经让现场更换硬件了。

    当用户点击按钮没反应的时候拔掉了网线,日志反映出就立马发起了请求,不过请求失败了。

    还有一次是发起了请求后,拦截器打印了发起的日志,在之后十三分钟之后打印了返回的日志,查看服务器端日志是在前端接到返回内容的稍早一二百毫秒接到的请求。所以应该前端打印发起日志的时候网络请求并没实际开始执行。

    请回答

    • issue 是否有人曾提过类似的问题?【必答】(一旦出现重复提问我将不会再次解答) 没有

    • 框架文档是否有提及到此问题?【必答】:是/否(请先看完框架的文档后再来提建议) 否,只有延迟加载的方法,但是我没有调用那个方法。

    question 
    opened by ymwm-lxl 6
Releases(11.5)
Owner
Android轮子哥
专业造轮子
Android轮子哥
Android Easy Http - Simplest android http request library.

Android Easy Http Library 繁體中文文檔 About Android Easy Http Library Made on OkHttp. Easy to do http request, just make request and listen for the respons

null 13 Sep 30, 2022
IceNet - Fast, Simple and Easy Networking for Android

IceNet FAST, SIMPLE, EASY This library is an Android networking wrapper consisting of a combination of Volley, OkHttp and Gson. For more information s

Anton Nurdin Tuhadiansyah 61 Jun 24, 2022
Easy, asynchronous, annotation-based SOAP for Android

IceSoap IceSoap provides quick, easy, asynchronous access to SOAP web services from Android devices. It allows for SOAP responses to be bound to Java

Alex Gilleran 75 Nov 29, 2022
Compact and easy to use, 'all-in-one' android network solution

Deprecated Unfortunately due to many reasons including maintenance cost, this library is deprecated. I recommend to use Retrofit/OkHttp instead. Curre

Orhan Obut 585 Dec 30, 2022
Easy-to-use webserver with Markdown.

Easy-to-use webserver with Markdown.

Tim 4 May 21, 2022
:satellite: [Android Library] Simplified async networking in android

Android library that simplifies networking in android via an async http client. Also featured in [Awesome Android Newsletter #Issue 15 ] Built with ❤︎

Nishant Srivastava 36 May 14, 2022
Android network client based on Cronet. This library let you easily use QUIC protocol in your Android projects

Android network client based on Cronet. This library let you easily use QUIC protocol in your Android projects

VK.com 104 Dec 12, 2022
Android Asynchronous Networking and Image Loading

Android Asynchronous Networking and Image Loading Download Maven Git Features Kotlin coroutine/suspend support Asynchronously download: Images into Im

Koushik Dutta 6.3k Dec 27, 2022
Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

OkHttp See the project website for documentation and APIs. HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP

Square 43.4k Jan 5, 2023
A type-safe HTTP client for Android and the JVM

Retrofit A type-safe HTTP client for Android and Java. For more information please see the website. Download Download the latest JAR or grab from Mave

Square 41k Jan 5, 2023
Android client for ProjectRTC - a WebRTC demo

AndroidRTC WebRTC Live Streaming An Android client for ProjectRTC. It is designed to demonstrate WebRTC video calls between androids and/or desktop br

Chabardes 1.5k Jan 6, 2023
Run Node.js on Android by rewrite Node.js in Java

node-android Run Node.js on Android by rewrite Node.js in Java with the compatible API. third-party: libuvpp, libuv-java JNI code by Oracle. Build Clo

AppNet.Link 614 Nov 15, 2022
dns library for android

Qiniu Happy DNS for Android 安装 直接安装 通过maven 使用方法 DnsManager 可以创建一次,一直使用。 IResolver[] resolvers = new IResolver[3]; resolvers[0] = AndroidDnsSe

Qiniu Cloud 270 Dec 5, 2022
HTTP Server for Android Instrumentation tests

RESTMock REST API mocking made easy. RESTMock is a library working on top of Square's okhttp/MockWebServer. It allows you to specify Hamcrest matchers

Andrzej Chmielewski 750 Dec 29, 2022
🚀 A Complete Fast Android Networking Library that also supports HTTP/2 🚀

Fast Android Networking Library About Fast Android Networking Library Fast Android Networking Library is a powerful library for doing any type of netw

AMIT SHEKHAR 5.5k Dec 27, 2022
Support for Spring's RestTemplate within native Android applications

Spring for Android Spring for Android is a library that is designed to provide components of the Spring Framework family of projects for use in native

Spring 710 Dec 20, 2022
The easiest HTTP networking library for Kotlin/Android

Fuel The easiest HTTP networking library for Kotlin/Android. You are looking at the documentation for 2.x.y.. If you are looking for the documentation

Kittinun Vantasin 4.3k Jan 8, 2023
Asynchronous socket, http(s) (client+server) and websocket library for android. Based on nio, not threads.

AndroidAsync AndroidAsync is a low level network protocol library. If you are looking for an easy to use, higher level, Android aware, http request li

Koushik Dutta 7.3k Jan 2, 2023
LiteHttp is a simple, intelligent and flexible HTTP framework for Android. With LiteHttp you can make HTTP request with only one line of code! It could convert a java model to the parameter and rander the response JSON as a java model intelligently.

Android network framework: LiteHttp Tags : litehttp2.x-tutorials Website : http://litesuits.com QQgroup : 42960650 , 47357508 Android网络通信为啥子选 lite-htt

马天宇 829 Dec 29, 2022