安卓开发调用本地接口以及设置base_url思路

去年接手pad端开发时曾问过其它组的老安卓一个问题,我们的安卓项目本地开发时能否调用本地接口,回答是否定的。也许是由于通用底座加入的限制,也许是因为太忙了,不想给我解释繁琐的解决方案。
那么在个人PC上玩耍总是能够调用本地接口的吧?同时考虑到先前做vue项目时能够通过修改前端的代理配置决定线上或线下接口,于是以安卓调用本地接口引出base_url的配置思路

单纯访问本地后端

开启明文通信

res/xml/network_security_config.xml 中允许明文通信:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><domain-config cleartextTrafficPermitted="true"><domain includeSubdomains="true">10.0.2.2</domain></domain-config>
</network-security-config>

在 AndroidManifest.xml 中引用该配置:

<applicationandroid:networkSecurityConfig="@xml/network_security_config"... >...
</application>

使用OkHttp定义请求

引入okhttp以及gson依赖(如果已有则不需要处理)

dependencies {implementation 'com.squareup.okhttp3:okhttp:4.9.0'implementation 'com.google.code.gson:gson:2.8.9'
}

定义PublicRepository管理请求调用处, getUserList用于获取用户列表信息,返回调用的callback,由调用处进行回调的解析

import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;/*** @author PineTree* @description: TODO* @date 2025/3/15 14:25*/
public class PublicRepository {private static volatile PublicRepository instance;private PublicRepository() {}public static PublicRepository getInstance() {if (instance == null) {synchronized (PublicRepository.class) {if (instance == null) {instance = new PublicRepository();}}}return instance;}public void getUserList(Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://10.0.2.2:8888/user/list").build();client.newCall(request).enqueue(callback);}
}

调用请求验证

PublicRepository.getInstance().getUserList(new Callback() {@Overridepublic void onFailure(@NotNull Call call, @NotNull IOException e) {String hehe = "111";}@Overridepublic void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {if (response.isSuccessful() && ObjectUtils.isNotEmpty(response.body())) {Gson gson = new Gson();List<UserVO> userVOS = gson.fromJson(response.body().string(), new TypeToken<List<UserVO>>() {}.getType());System.out.println("response.body() = " + userVOS);}}
});

在这里插入图片描述

加入base_url管理

考虑到每个请求都将IP、端口号等这些随环境变化的动态参数都写在url显得不优雅,于是引入了base_url

定义base_url

在模块的build.gradle中添加构建配置信息,默认为debug

    defaultConfig {buildConfigField "String", "APP_ENV", "\"${project.hasProperty('APP_ENV') ? project.property('APP_ENV') : 'debug'}\""}

如果com.android.tools.build:gradle:为8+,还需要添加android.buildFeatures.buildConfig设置为true

    buildFeatures {viewBinding truebuildConfig true}

新建url管理类

新建类UrlManage,在getBaseUrl方法中获取构建信息参数BuildConfig.APP_ENV,进而决定返回哪个环境的url(真实项目一般采用类似思路获取需要路由的网关)

package com.example.myapplication1_java.util;import com.example.myapplication1_java.BuildConfig;
import com.example.myapplication1_java.repository.PublicRepository;/*** @author PineTree* @description: url管理* @date 2025/3/16 19:45*/
public class UrlManage {private static volatile UrlManage instance;private UrlManage() {}public static UrlManage getInstance() {if (instance == null) {synchronized (PublicRepository.class) {if (instance == null) {instance = new UrlManage();}}}return instance;}public String getBaseUrl() {String appEnv = BuildConfig.APP_ENV;String baseUrl = "";switch (appEnv) {case "debug":baseUrl = "http://10.0.2.2:8888/";break;case "dev":baseUrl = "http://dev:8888/";break;case "sit":baseUrl = "http://sit:8888/";break;case "uat":baseUrl = "http://uat:8888/";break;}return baseUrl;}}

调整OkHttp定义请求

import com.example.myapplication1_java.util.UrlManage;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;/*** @author PineTree* @description: TODO* @date 2025/3/15 14:25*/
public class PublicRepository {...public void getUserList(Callback callback) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(UrlManage.getInstance().getBaseUrl() + "user/list").build();client.newCall(request).enqueue(callback);}
}

验证默认base_url生效

在这里插入图片描述

验证修改base_url生效

修改APP_ENV为uat,验证base_url切换生效,在控制台执行下面指令

# 切换到模块目录
cd app
# clean旧的构建
gradle clean
# 生成 debug APK 设置APP_ENV为uat
gradle assembleDebug -PAPP_ENV=uat 
# 上传APK
adb install -r build/outputs/apk/debug/app-debug.apk
# 启动应用
adb shell am start -n com.example.myapplication1_java/.MainActivity 

在这里插入图片描述
由于本地并没有uat环境接口,解析不了uat请求会报错
在这里插入图片描述

总结

通过以上的配置,就能访问本地测试,并进行base_url的统一管理了,该博客适用于个人demo验证,仅供参考。
代码见https://gitee.com/pinetree-cpu/android_demo_test

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

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

相关文章

中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南

目录 背景‌一、环境规划与依赖准备‌1. 服务器规划(3节点集群)2. 系统与依赖‌3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置‌1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置‌4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…

003 SpringCloud整合-LogStash安装及ELK日志收集

SpringCloud整合-LogStash安装及ELK日志收集 文章目录 SpringCloud整合-LogStash安装及ELK日志收集1.安装ElasticSearch和kibana2.Docker安装logstash1.拉取docker镜像2.创建外部挂载目录3.拷贝容器内部文件到宿主机4.修改外部挂载文件5.运行docker容器 3.整合kibana1.进入kiba…

《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用

《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用 《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用内核对象内核对象的定义内核对象归操作系统所有 基于 Windows 的线程创建进程与线程的关系Windows 中线程的创建方…

【Git学习笔记】Git分支管理策略及其结构原理分析

【Git学习笔记】Git分支管理策略及其结构原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…

STAR Decomposition 一种针对极端事件的信号分解方法 论文精读加复现

STAR 分解&#x1f680; 在时序预测任务中&#xff0c;为了情绪化信号的各种成分&#xff0c;例如趋势信息季节信息等往往都需要对信号进行分解。目前熟知的分解方式有很多种&#xff0c;经验模态分解 EMD 变分模态分解 VMD &#xff0c;还有 集合经验模态分解 EEMD&#xff0c…

大一新生备战蓝桥杯c/c++B组——2024年省赛真题解题+心得分享

一&#xff0c;握手问题 这个题用点像小学奥数&#xff0c;直接手算就行 答案&#xff1a;1204 二&#xff0c;小球反弹 这个题思路简单&#xff0c;但是运行会显示超时。在思考思考&#xff0c;后续补代码。 三&#xff0c;好数 思路一&#xff1a; #include <iostream&…

【最新版】智慧小区物业管理小程序源码+uniapp全开源

一.系统介绍 智慧小区物业管理小程序,包含小区物业缴费、房产管理、在线报修、业主活动报名、在线商城等功能。为物业量身打造的智慧小区运营管理系统,贴合物业工作场景,轻松提高物业费用收缴率,更有功能模块个性化组合,助力物业节约成本高效运营。 二.搭建环境 系统环…

OLE注册是什么?

在Windows操作系统的生态中&#xff0c;‌OLE&#xff08;Object Linking and Embedding&#xff0c;对象链接与嵌入&#xff09;‌ 是一项核心技术&#xff0c;它使得不同应用程序之间能够共享数据和功能。例如&#xff0c;用户可以在Word文档中嵌入一个Excel表格&#xff0c;…

深入理解Linux文件系统:从磁盘结构到inode与挂载

博客总结 核心内容 磁盘物理结构 机械硬盘&#xff08;HDD&#xff09;与固态硬盘&#xff08;SSD&#xff09;的区别&#xff0c;磁盘的组成&#xff08;盘片、磁头、磁道、扇区&#xff09;及工作原理&#xff08;磁头悬浮、高速旋转&#xff09;。 企业级磁盘与桌面级磁盘的…

Spring Data JPA 参数陷阱:从 500 错误到完美解决的奇妙之旅 ✨

&#x1f680; Spring Data JPA 参数陷阱&#xff1a;从 500 错误到完美解决的奇妙之旅 &#x1f31f; 嘿&#xff0c;各位技术冒险家&#xff01;&#x1f44b; 今天我要带你们走进一场 Spring Data JPA 的“参数迷雾”救援行动——从一个让人抓狂的 500 错误&#xff0c;到最…

YOLO obb全流程

内容&#xff1a;xanylabeling 数据标注工具&#xff1b;pytorch&#xff08;python&#xff09;&#xff1b;yolo-obb 模型 一、数据集 1、数据集工具xanylabeling的安装 &#xff08;详细配置与使用方法参考&#xff1a;X-Anylabeling自动标注软件安装使用教程含conda环境…

基于大语言模型与知识图谱的智能论文生成工具开发构想

基于大语言模型与知识图谱的智能论文生成工具开发构想 一、研究背景与意义 1.1 学术写作现状分析 #mermaid-svg-FNVHG5EiEgVSCpHK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FNVHG5EiEgVSCpHK .error-icon{fil…

学c++的人可以几天速通python?

学了俩天啊&#xff0c;文章写纸上了 还是蛮有趣的

【计算机网络】一二章

一 二 非常棒的例子 相同的传播时延&#xff0c;带宽越大&#xff0c;该链路上所能容纳的比特数越多 相同的传播时延&#xff0c;带宽越大&#xff0c;该链路上所能容纳的比特数越多 往返时间&#xff08;Round-Trip Time&#xff0c;RTT&#xff09;s是指从发送端发送数据分组…

使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示

使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域&#xff0c;经常需要将树莓派作为视频流服务器&#xff0c;通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库&#xff…

Kafka跨集群数据备份与同步:MirrorMaker运用

#作者&#xff1a;张桐瑞 文章目录 前言MirrorMaker是什么运行MirrorMaker各个参数的含义 前言 在大多数情况下&#xff0c;我们会部署一套Kafka集群来支撑业务需求。但在某些特定场景下&#xff0c;可能需要同时运行多个Kafka集群。比如&#xff0c;为了实现灾难恢复&#x…

ECharts仪表盘-仪表盘12,附视频讲解与代码下载

引言&#xff1a; ECharts仪表盘&#xff08;Gauge Chart&#xff09;是一种类似于速度表的数据可视化图表类型&#xff0c;用于展示单个或多个变量的指标和状态&#xff0c;特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘&#xff0c;…

Harmony OS【 Tabs 导航篇】

设计图&#xff1a; 代码层&#xff1a; Entry Component struct Index {build() {Tabs({ barPosition: BarPosition.End }) {}.scrollable(false).vertical(false).divider({strokeWidth: 0.5,color: #0d182431}).backgroundColor(#F1f3f5).padding({ top: 36, bottom: 28 }…

兆芯大道云行 | 破解高性能云计算数据存储瓶颈

随着数字化转型的加速和数据安全战略的提升&#xff0c;以及国家政策的驱动&#xff0c;政府、金融、能源等关键领域对数据存储的自主可控要求不断提高&#xff0c;传统依赖国外芯片和技术的集中式存储架构面临安全与扩展性瓶颈。例如&#xff0c;政务云场景中原有的非信创服务…

RSI 量化策略实战指南:基于 iTick 报价源的 Python 实现

一、策略原理 相对强弱指标&#xff08;Relative Strength Index, RSI&#xff09;是由 Welles Wilder 提出的经典技术指标&#xff0c;通过计算价格波动的幅度衡量市场超买 / 超卖状态。RSI 取值范围 0-100&#xff0c;常用判断标准&#xff1a; RSI > 70&#xff1a;超买…