当前位置: 首页 > news >正文

android 框架—网络访问Okhttp

下面给出一份 最新可直接拷贝运行 的 Android OkHttp 基本使用速查表,
覆盖“依赖 → 权限 → 常用 GET/POST/上传 → 同步/异步 → 线程模型 → 踩坑”6 大环节,

依赖 & 权限(一次到位)

依赖

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

权限

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- Android 9+ 允许 http 明文(开发阶段)-->
<application android:usesCleartextTraffic="true" ... >

全局单例工具类(线程安全)

public final class HttpUtil {private static final OkHttpClient CLIENT = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).addInterceptor(chain -> {                       // 极简日志拦截器Request req = chain.request();Log.d("OKHTTP", req.method() + " " + req.url());return chain.proceed(req);}).build();public static OkHttpClient client() { return CLIENT; }
}

GET 请求(异步)

public static void getAsync(String url, Callback cb) {Request req = new Request.Builder().url(url).get().build();HttpUtil.client().newCall(req).enqueue(cb);
}/* 使用 */
getAsync("https://api.github.com/users/google", new Callback() {@Override public void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("OKHTTP", "get error", e);}@Override public void onResponse(@NonNull Call call, @NonNull Response resp) throws IOException {if (resp.isSuccessful()) {String body = resp.body().string();Log.i("OKHTTP", "get body=" + body);}}
});

POST 表单(application/x-www-form-urlencoded)

public static void postFormAsync(String url, Map<String,String> params, Callback cb) {FormBody.Builder fb = new FormBody.Builder();for (Map.Entry<String,String> e : params.entrySet()) fb.add(e.getKey(), e.getValue());Request req = new Request.Builder().url(url).post(fb.build()).build();HttpUtil.client().newCall(req).enqueue(cb);
}

POST JSON(application/json)

public static void postJsonAsync(String url, String json, Callback cb) {RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));Request req = new Request.Builder().url(url).post(body).build();HttpUtil.client().newCall(req).enqueue(cb);
}

文件上传(Multipart,带进度)

public static void uploadAsync(String url, File file, Callback cb) {RequestBody fileBody = RequestBody.create(file, MediaType.parse("application/octet-stream"));MultipartBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), fileBody).addFormDataPart("key", "extra")   // 可继续加字段.build();Request req = new Request.Builder().url(url).post(body).build();HttpUtil.client().newCall(req).enqueue(cb);
}

下载文件(带进度,Kotlin 版更简洁,这里给 Java)

public static void downloadAsync(String url, File saveFile, ProgressListener listener, Callback cb) {Request req = new Request.Builder().url(url).build();OkHttpClient downClient = HttpUtil.client().newBuilder().addNetworkInterceptor(chain -> {Response original = chain.proceed(chain.request());return original.newBuilder().body(new ProgressResponseBody(original.body(), listener)).build();}).build();downClient.newCall(req).enqueue(cb);
}/* 进度回调 */
public interface ProgressListener {void update(long bytesRead, long contentLength, boolean done);
}/* 包装 ResponseBody 计算进度 */
private static class ProgressResponseBody extends ResponseBody {private final ResponseBody delegate;private final ProgressListener listener;ProgressResponseBody(ResponseBody d, ProgressListener l) { delegate = d; listener = l; }@Override public long contentLength() { return delegate.contentLength(); }@Override public MediaType contentType() { return delegate.contentType(); }@Override public BufferedSource source() {return Okio.buffer(new ForwardingSource(delegate.source()) {long total = 0L;@Override public long read(Buffer sink, long byteCount) throws IOException {long bytes = super.read(sink, byteCount);total += (bytes != -1 ? bytes : 0);listener.update(total, contentLength(), bytes == -1);return bytes;}});}
}

同步调用(不推荐主线程,仅给单元测试)

public static String getSync(String url) throws IOException {Request req = new Request.Builder().url(url).get().build();try (Response resp = HttpUtil.client().newCall(req).execute()) {if (!resp.isSuccessful()) throw new IOException("code=" + resp.code());return resp.body().string();}
}

注意事项(面试常问)

  • 所有 onResponse 回调不在主线程,若更新 UI 记得 runOnUiThread() / Handler / LiveData.postValue()

  • ResponseBody.string() 只能读一次,再读需要 cache() 或自己缓存。

  • Android 9+ 默认禁止 HTTP 明文,需在 AndroidManifest.xml
    android:usesCleartextTraffic="true" 或配置 networkSecurityConfig

  • 上传/下载大文件用 @Streaming + MultipartBody 边读边写,防止 OOM。

“先 client 后 request,enqueue 异步 execute 同步;
FormBody 表单,RequestBody JSON,Multipart 传文件;
回调非 UI 线程,刷新界面要切换!”


文章转载自:

http://lmFkK5n8.fbmjw.cn
http://dU6FYVlL.fbmjw.cn
http://MuS0jayJ.fbmjw.cn
http://3spjv61Q.fbmjw.cn
http://7vy16QOD.fbmjw.cn
http://zVKaxtTQ.fbmjw.cn
http://9fJq4vCn.fbmjw.cn
http://L22OZYaN.fbmjw.cn
http://OijGWCjD.fbmjw.cn
http://XVdLNUjl.fbmjw.cn
http://mnszsiII.fbmjw.cn
http://qWgEFyM4.fbmjw.cn
http://UAiCnC3z.fbmjw.cn
http://XIpbmIzy.fbmjw.cn
http://kwhbqfco.fbmjw.cn
http://zMEqhxhM.fbmjw.cn
http://AxxlKqI1.fbmjw.cn
http://Rj3Unoiw.fbmjw.cn
http://ZXtIA5GJ.fbmjw.cn
http://17inQ61W.fbmjw.cn
http://jpf1VumV.fbmjw.cn
http://YLE6FzCc.fbmjw.cn
http://P76JHEtH.fbmjw.cn
http://EubOI97u.fbmjw.cn
http://AbKpGwfT.fbmjw.cn
http://nr3yzesP.fbmjw.cn
http://Z9fNQDFR.fbmjw.cn
http://PRWJu8Wf.fbmjw.cn
http://r4cpBjxj.fbmjw.cn
http://GbzbXG7b.fbmjw.cn
http://www.dtcms.com/a/384670.html

相关文章:

  • CUDA 中Thrust exclusive_scan使用详解
  • Quat 四元数库使用教程:应用场景概述
  • GitHub 热榜项目 - 日榜(2025-09-15)
  • 让AI数据中心突破性能极限
  • Self-supervised Feature Adaptation for 3D Industrial Anomaly Detection 论文精读
  • 【3D图像算法技术讨论】如何给基于3dgs重建的城市街景增加碰撞的属性,满足仿真的要求?
  • numpy学习笔记
  • Oracle体系结构-归档日志文件(Archive Log Files)
  • 唐源电气:机器视觉与AI Agent引领智能运维
  • 【Python】在pycharm中使用environment.ylm文件配置虚拟环境
  • 2025前端面试题及答案-2(详细)
  • 技术突破:《Light Sci. Appl.》SH-GSL理论,为超表面提供全通道谐波调控能力
  • 2025年ASOC SCI2区TOP,多类别教学优化算法+多修剪机器人与多施肥无人机协同任务分配,深度解析+性能实测
  • 佰力博检测与您探讨高低温介电测试的应用领域
  • 网络编程-day6
  • 【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
  • 《格式工厂FormatFactory》 [5.21.0][便携版] 下载
  • 【ubuntu24.04】安装rust
  • vue-sync修饰符解析以及切换iframe页面进行保存提示功能的思路
  • 005 Rust变量与常量
  • DOM---操作元素样式属性详解
  • Excel简单教程
  • Node.js 项目依赖包管理
  • LabVIEW命令行使用方法
  • 单变量单步时序预测 | TCN-LSTM时间卷积结合长短期记忆神经网络(MATLAB)
  • ESLint 自定义 Processor(处理器)
  • MySQL 极致性能优化指南——从 INSERT 到 UPDATE 的七大战场
  • Web前端开发工具有哪些?常用Web前端开发工具推荐、Web前端开发工具对比
  • 一款开源的im简介
  • Vite Plugin PWA – 零配置构建现代渐进式Web应用