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" />

<applicationandroid: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;}@Overridepublic 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(){@Overridepublic 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:02List<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() {@Overridepublic 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);}@Overridepublic  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() {@Overridepublic 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() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {e.printStackTrace();Logger.e("get异步响应失败==" + e.toString());}@Overridepublic 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();

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下已经创建好了虚拟环境,但是切换不了的解决方法

用得多Ubuntu&#xff0c;今天用Windows重新更新anaconda出问题&#xff0c;重新安装之后&#xff0c;打开pycharm发现打开终端之后&#xff0c;刚开始是ps的状态&#xff0c;后面试了网上改cmd的方法&#xff0c;终端变成c盘开头了 切换到虚拟环境如下&#xff1a;目前的shell…

实现iOS App代码混淆

简介 在开发iOS应用程序时&#xff0c;保护代码安全是至关重要的。代码混淆是一种常用的技术&#xff0c;可以增加逆向工程的难度&#xff0c;防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

大数据平台搭建2024(一)

一&#xff1a;基础配置 创建虚拟机并查出ip地址进行连接 ip a1.配置node01静态ip地址与主机名 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改或添加如下内容&#xff1a; BOOTPROTO"static" ONBOOTyes #根据虚拟机网卡信息配置 IPADDR192.168.200.141 NET…

时隔一年,再次讨论下AutoGPT-安装篇

AutoGPT是23年3月份推出的&#xff0c;距今已经1年多的时间了。刚推出时&#xff0c;我们还只能通过命令行使用AutoGPT的能力&#xff0c;但现在&#xff0c;我们不仅可以基于AutoGPT创建自己的Agent&#xff0c;我们还可以通过Web页面与我们创建的Agent进行聊天。这次的AutoGP…

conda新建环境报错An HTTP error occurred when trying to retrieve this URL.

conda新建环境报错如下 cat .condarc #将 .condarc文件中的内容删除&#xff0c;改成下面的内容 vi .condarc channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.…

2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型 AI 工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在 AI 的另一个分支——绘图领域&#xff0c;一款名为 Midjourney&#xff08;MJ&…

【教程】cocos2dx资源加密混淆方案详解

1,加密,采用blowfish或其他 2,自定是32个字符的混淆code 3,对文件做blowfish加密,入口文件加密前将混淆code按约定格式(自定义的文件头或文件尾部)写入到文件 4,遍历资源目录,对每个文件做md5混淆,混淆原始串“相对路径”“文件名”混淆code, 文件改名并且移动到资源目录根…

【Entity Framework】你必须要了解EF中数据查询之数据加载

【Entity Framework】你必须要了解EF中数据查询之数据加载 文章目录 【Entity Framework】你必须要了解EF中数据查询之数据加载一、概述二、预先加载2.1 包含多个层级2.2 经过筛选的包含 三、显示加载3.1查询关联实体 四、延时加载4.1 不使用代理进行延迟加载 一、概述 Entity…

电脑网络一切正常但无法上网-注意检查代理

当电脑出现无法上网&#xff0c; 但是网络适配器又一切正常的时候&#xff0c; 不妨检查一下网络代理设置&#xff0c; 看是否处于开启状态。如果是开启状态&#xff0c; 关闭后再次尝试。 代理服务器自动设置成开启状态&#xff0c; 并且代理地址服务器地址设置成127.0.0.1:1…

提升测试效率都有哪些具体手段?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

OVITO-2.9版本

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

Matlab|电价型负荷需求响应(考虑电价变化)

程序复现来源于《计及需求响应消纳风电的电-热综合能源系统经济调度 》第四章内容。 一、原理 需求响应的基本原理是需求侧根据电力市场价格和电网要求改变其负荷需求以 获取一定的利益回报。其中 PDR 可通过直观的电价变化信号引导用户调节用电方式&#xff0c; 从而达到优…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢&#xff1f; 1.2. 市场主流 JVM 分析&#xff1f; 1.3. 为什么要学习 JVM&#xff1f; 1.4. 字节码底层是如何执行呢&#xff1f; 如何理解 JIT 呢&#xff1f; 为什么 JVM 中解释执行与编译执行的并存&#xff08;混合模式&…

JavaScript 高性能编程 —— 加载和运行

JavaScript 在浏览器中的性能,可认为是开发者所要面对的最重要的可用性问题。此问题因 JavaScript 的阻塞特征而复杂,也就是说,当 JavaScript 运行时其他的事情不能被浏览器处理。 事实上,大多数浏览 器使用单进程处理 UI 更新和 JavaScript 运行等多个任务,而同一时间只能…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

OpenHarmony实战开发-Worker子线程中解压文件。

介绍 本示例介绍在Worker 子线程使用ohos.zlib 提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作&#xff0c;解压成功后将解压路径返回主线程&#xff0c;获取解压文件列表。 效果图预览 使用说明 1.点击解压按钮&#xff0c;解压test.zip文件&#xff0c…

Spring底层如何执行?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring底层如何执行refresh()prepareRefresh() 准备刷新的工作initPropertySources() obtainFreshBeanFactory()refreshBeanFactory()AbstractRefreshableApplicati…

【ensp】VLAN间通信的解决办法

目录 VLAN间通信简介 VLAN间通信的两种方式 借助三层设备路由器进行VLAN间的通信&#xff08;也就是单臂路由&#xff09; 在端口上创建子接口之后为什么需要开启arp广播&#xff0c;是因为他是子接口吗? 拓扑图 交换机配置 路由器配置 查看路由器配置 测试能否实现…

Element-Ui的Form表单:Label文本两端对齐,且必填项的*不影响布局

1. HTML 结构 首先&#xff0c;确保你的 HTML 或 Vue 模板中有一个 el-form 组件&#xff0c;类似下面这样&#xff1a; <div id"app"><el-form :model"form" label-width"100px"><el-form-item label"用户名">&l…

基于springboot的医护人员排班系统

随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医护人员排班系统的开发全过程。通过分析医护人员排班系统管理的不足&#xff0c;创建了一个计算机管理医护人员排班系统的方案。文章介绍了医护人员排班系统的系统分…