android studio 网络请求okhttp3、okgo

一、在build.gradle文件里添加

implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.squareup.okio:okio:1.17.4'
implementation 'com.lzy.net:okgo:3.0.4'
implementation 'com.alibaba:fastjson:1.2.57'
implementation 'com.orhanobut:logger:2.2.0'

com.alibaba:fastjson:用于JSON解析,
com.orhanobut:logger:用于输出日志

二、在AndroidManifest.xml里添加

//支持网络请求
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

//其他
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application
    android:name=".App"
    android:allowBackup="true"
    android:icon="@mipmap/cookie"
    android:label="手机端测试"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.Drysister"
    android:usesCleartextTraffic="true">

//在App里初始化okgo
android:name=".App"
//不安全请求的限制级别,降低安全级别
//参考:解决:qemu_pipe_open_ns:62: Could not connect to the ‘pipe:qemud:network‘ service: Invalid argument 202_qemu_pipe_open_ns:62: could not connect to the 'pi-CSDN博客
android:usesCleartextTraffic="true"

三、新建App,初始化okgo、Logger

public class App extends Application {
    private static App mInstance;
    public static App getInstance()
    {
        if(mInstance==null){
            mInstance=new App();
        }
        return mInstance;
    }
    @Override
    public void onCreate()
    {
        super.onCreate();
        mInstance = this;
        OkGo.getInstance().init(this).
                setOkHttpClient(new OkHttpClient.Builder()
                        .readTimeout(10000L, TimeUnit.MILLISECONDS)
                        .writeTimeout(10000L, TimeUnit.MILLISECONDS)
                        .connectTimeout(10000L, TimeUnit.MILLISECONDS)
                        .build())
                .setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)   //全局统一缓存时间,默认永不过期,可以不传
                .setRetryCount(3)                               //全局统一超时重连次数,默认为三次,
                // 那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
                .setCacheMode(CacheMode.NO_CACHE)
                .setCacheTime(-1L);
         //日志格式化
        FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
                .showThreadInfo(false)  // 是否显示线程信息 默认显示 上图Thread Infrom的位置
                .methodCount(1)         // 展示方法的行数 默认是2  上图Method的行数
                .methodOffset(0)        // 内部方法调用向上偏移的行数 默认是0
                //.logStrategy(customLog) // 改变log打印的策略一种是写本地,一种是logcat显示 默认是后者(当然也可以自己定义)
                .tag("DCSYT")   // 自定义全局tag 默认:PRETTY_LOGGER
                .build();
        //在Application中初始化一下
        Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
        Logger.addLogAdapter(new DiskLogAdapter(){
            @Override
            public boolean isLoggable(int priority, @Nullable String tag) {
                return BuildConfig.DEBUG;
            }
        });

//        Logger.d("Start APP");

    }


}

四、OkGo

         Map<String, String> localMap = new HashMap<>();
                localMap.put("strdt", "2022-11-03 14:04:02");//strdt=2022-11-03 14:04:02
                List<String> urlparams=new ArrayList<>();
                List<File> fileparams=new ArrayList<>();
                List<HttpParams.FileWrapper> filewrappers=new ArrayList<>();
                String serveurl="https://stqmf.fzdc.cn/home/getTime";//
                OkGo.<String>get(serveurl )//get<=>post 请求方式
                        .tag(this)           // 请求的tag,主要用于取消对应的请求
//                        .isMultipart(true)   //制使用multipart/form-data表单上传
//                        .isSpliceUrl(true)   //制将params的参数拼接到url后面
                        .retryCount(3)       // 超时重连次数
//                        .cacheKey("caceKey") // 设置当前请求的缓存key
//                        .cacheTime(5000)     // 缓存的过期时间,单位毫秒
//                        .cacheMode(CacheMode.DEFAULT)        // 缓存模式,详细请看第四部分,缓存介绍
//                        .headers("header1","headervalue1")   // 添鞏玗禧弓罩谨加请求头参数
                        .params(localMap)                    // 添加请求参数
//                        .addUrlParams("key",urlparams)
//                        .addFileParams("key",fileparams)
//                        .addFileWrapperParams("key",filewrappers)
                        .execute(new StringCallback() {
                                     @Override
                                     public void onSuccess(Response<String> response) {
                                         Logger.d("OkGo...onSuccess," + response.code() + "-" + response.body());
                                         UserDto obj= JSON.parseObject(response.body().toString(),UserDto.class);
                                         Logger.d(obj.data);
                                     }
                                     @Override
                                     public  void onError(Response<String> response) {
                                         Logger.d("OkGo...onError," + response.code() + "-" + response.body());
                                     }
                                 });

五、OkHttpClient

 //1.构建OkHttpClient实例
                final OkHttpClient okHttpClient = new OkHttpClient.Builder()
                        .connectTimeout(200, TimeUnit.SECONDS)//链接超时为2秒,单位为秒
                        .writeTimeout(200, TimeUnit.SECONDS)//写入超时
                        .readTimeout(200, TimeUnit.SECONDS)//读取超时
                        .build();



                //创建线程,在子线程中运行
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //1、异步get...
                            //通过Builder辅助类构建Request对象,链式编程
                            String url="https://stqmf.fzdc.cn/home/getTime";
                            HttpUrl.Builder httpBuilder = HttpUrl.parse(url).newBuilder();
                            httpBuilder.addQueryParameter("strdt","2022-11-04 0:04:02");

                            Request request = new Request.Builder()
                                    .url(httpBuilder.build())
                                    .get()
                                    .build();
                            //异步
                            okHttpClient.newCall(request).enqueue(new Callback() {
                                @Override
                                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                                    e.printStackTrace();
                                    Logger.e("get异步响应失败==" + e.toString());
                                }

                                @Override
                                public void onResponse(@NotNull Call call, @NotNull okhttp3.Response response) throws IOException {
                                    String result = response.body().string();
                                    Logger.e("get异步响应成功==" + result);
                                    UserDto obj=JSON.parseObject(result,UserDto.class);
                                    Logger.e(obj.data);


                                }
                            });


                            //2、同步GET
//                            Request request = new Request.Builder()
//                                    .get()//get请求
//                                    .url("https://stqmf.fzdc.cn/home/getTime")//请求地址
//                                    .build();//构建
//                            //通过mOkHttpClient调用请求得到Call
//                            final Call call = okHttpClient.newCall(request);
//                            //执行同步请求,获取Response对象
//                            okhttp3.Response response = call.execute();
//
//                            if (response.isSuccessful()) {//如果请求成功
//                                String string = response.body().string();
//                                Logger.e("get同步请求success==" + string);
//                                //响应体的string()对于小文档来说十分方便高效,但是如果响应体太大(超过1M),应避免使用string()方法,
//                                //因为它会把整个文档加载到内存中,对用超多1M的响应body,应该使用流的方式来处理。
//
//                                //response.body().bytes();//字节数组类型
//                                //response.body().byteStream();//字节流类型
//                                //response.body().charStream();//字符流类型
//
//                            } else {
//                                Logger.e("get同步请求failure==");
//                            }

                            //3、同步POST...
//                            //提交键值对需要用到FormBody,FormBody继承自RequestBody
//                            FormBody formBody = new FormBody.Builder()
//                                    //添加键值对(通多Key-value的形式添加键值对参数)
//                                    .add("key", "value")
//                                    .build();
//
//                            final Request request = new Request.Builder()
//                                    .post(formBody)
//                                    .url("https://stqmf.fzdc.cn/home/getTime")//URL地址
//                                    .build();
//
//                            okhttp3.Response response = okHttpClient.newCall(request).execute();
//                            if (response.isSuccessful()) {
//                                Logger.e("Post请求String同步响应success==" + response.body().string());
//                            } else {
//                                Logger.e("Post请求String同步响应failure==" + response.body().string());
//                            }

                            //4、异步POST...
//                            okHttpClient.newCall(request).enqueue(new Callback() {
//                                @Override
//                                public void onFailure(@NotNull Call call, @NotNull IOException e) {
//                                    Logger.e("Post请求(键值对)异步响应failure==" + e.getMessage());
//                                }
//
//                                @Override
//                                public void onResponse(@NotNull Call call, @NotNull okhttp3.Response response) throws IOException {
//                                    String result = response.body().string();
//                                    Logger.e("Post请求(键值对)异步响应Success==" + result);
//                                }
//                            });

                        } catch (Exception e) {

                            Logger.e("请求IOException==" + e.toString());
                        }
                    }
                }).start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/540484.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯【第15届省赛】Python B组

这题目难度对比历届是相当炸裂的简单了…… A&#xff1a;穿越时空之门 【问题描述】 随着 2024 年的钟声回荡&#xff0c;传说中的时空之门再次敞开。这扇门是一条神秘的通道&#xff0c;它连接着二进制和四进制两个不同的数码领域&#xff0c;等待着勇者们的探索。 在二进制…

# Nacos 服务发现-快速入门-创建服务消费者模块,使用 feign 调用 服务生产者

Nacos 服务发现-快速入门-创建服务消费者模块&#xff0c;使用 feign 调用 服务生产者 1、 新增 quickstart_consumer 子工程&#xff08;子模块&#xff09;&#xff0c; 创建子模块&#xff1a;--> 右键 nacos_discovery 父工程 --> Modules --> Maven --> G…

小剧场短剧剧集收费短剧小程序APP

1. 内容展现 付费、免费、任务解锁&#xff1a;用户可以通过付费直接观看短剧&#xff0c;也可以通过完成平台任务&#xff08;如签到、分享等&#xff09;获得免费观看的机会。这种灵活的解锁方式既满足了用户的多种需求&#xff0c;也促进了平台的活跃度。主流展现形式&…

MyBatis核心配置文件介绍使用

文章目录 一、environments二、properties三、typeAliases四、mappers五、创建核心配置文件模板&映射文件模板核心配置文件模板映射文件模板 六、总结 一、environments 核心配置文件中的标签必须按照固定的顺序&#xff1a; properties?,settings?,typeAliases?,typeH…

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示&#xff08;考勤打卡&#xff09; 一、创建百度地图账号&#xff0c;获取秘钥二、 引入插件1、安装vue-baidu-map2、在main.js中引入 三、 简单使用 最近写项目的时候&#xff0c;做到了考勤打卡的模块内容&#x…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

【C++类和对象】上篇

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Xilinx Zynq UltraScale+ MPSoC无人机控制器

官方术语是无人驾驶飞行器&#xff08;UAV&#xff09;&#xff0c;这显然有点拗口&#xff0c;所以我们更喜欢说无人机。在过去的几十年里&#xff0c;无人机技术有了巨大的进步。我们为一个客户开发了一个无人机的飞行和视频控制器。 客户挑战 客户需要一种混合FPGA/CPU硬件&…

idea keymap用eclipse的相关快捷键

idea快捷键用eclipse的方式 CtrlShiftR 搜索文件 shiftshift 全部文件/类搜索 CtrlH 全局搜索 CtrlO 快速打开Outline大纲视图 ctrle 查看recent窗口文件 ctrlt 快速进入接口的实现类 ctrlshiftf 格式化代码 altshiftr 变量或函数的重命名 ctrlshifto 移除无用的头文…

MySQL基础知识——MySQL日志

一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块&#xff0c; 最后到达存储引擎。 那么&#xff0c; 一条更新语句的执行流程又是怎样的呢&#xff1f; 下面我们从一个表的一条更新语句进行具体介绍&#xff1a; 假设这个表有一个主键ID和一个…

MySQL:MySQL的查询(上)

文章目录 MySQL的增加单行数据插入多行数据插入插入否则更新替换 MySQL的查询select列where语句 本篇开始总结的是MySQL当中的基本查询语句 对于数据库的查询&#xff0c;无非大致就是增删查改&#xff0c;因此对于这些内容进行一一解释&#xff1a; MySQL的增加 单行数据插…

Redis中的集群(九)

集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信&#xff0c;我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者&#xff0c;如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时&#xff0c…

二叉树练习day.8

235.二叉搜索树的最近公共祖先 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共…

一起找bug之购物

如果不是购物车满了&#xff0c;大概都不会发现这个 bug 淘宝 APP 修复了购物车满的情况下&#xff0c;往里面添加新商品时&#xff0c;会把一个老商品移入收藏夹&#xff0c; 但是如果这个老商品是已失效状态&#xff0c;就无法自动移入收藏夹&#xff0c;而且会一直在购物车…

AI禁区徘徊监测识别摄像机

AI禁区徘徊监测识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;用于监测禁止进入或逗留的区域。这种摄像机通过高清摄像头实时捕捉场景图像&#xff0c;利用AI算法对人员徘徊行为进行识别和监测&#xff0c;有助于提高安全防范水平&#xff0c;减少潜在的安全风险…

【DL水记】循环神经网络RNN的前世今生,Transformer的崛起,Mamba模型

文章目录 RNN网络简介传统RNN网络结构RNN的分类 长-短期记忆网络 (LSTM)GRU网络横空出世的Transformer网络Self-AttentionVisionTransformer Mamba模型Reference: RNN网络简介 “当人类接触新事物时&#xff0c;他们不会从头开始思考。就像你在阅读这篇文章时&#xff0c;你会根…

基于springboot仿雀语的文档管理系统

项目介绍 本项目借鉴了雀语的一些UI设计&#xff0c;实现了文档在线管理的功能&#xff0c;知识库可以对不同分类的文档建立不同的库&#xff0c;知识库里面左边可以维护菜单菜单目录&#xff0c;右边实现在线预览。该项目可以防止用户下载和复制文档&#xff0c;只支持在线预…

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…

接招吧! selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 …

UltraScale 架构 SelectIO 资源之IODELAY与IOSERDES仿真与使用

平台&#xff1a;vivado2018.3 具体内容见ug571-ultrascale-selectio IDELAYE3 在调试超高速信号的时候&#xff0c;需要使用iodelayiserdes来调试校准输入信号。例如外部某ADC采样率为5GHZ&#xff0c;外部ADC使用2.5GHZ的时钟去采集输入信号。为了实现采集&#xff0c;adc芯…