Android OkHttp使用过程中的一些经验总结

💡 原文中文,约13100字,阅读约需32分钟。
📝

内容提要

本文总结了Android中常见的网络优化方法,主要包括DNS、HTTP和WebView三个方面。在DNS部分,介绍了常见的DNS问题和优化方法。在HTTP部分,讨论了HTTP相关问题和优化方法,包括紧缩数据、运用HTTP2协议、运用Cache-Control等。在WebView部分,探讨了WebView相关问题和优化方法,如优化内存占用、预加载、创建WebView缓存池等。此外,还提到了网络结构、Cookie存储、链接池与线程池、接口访问计算、数据包监控等方面的优化方法。文章指出,网络优化主要涉及HTTP交互,本文介绍的技巧对大多数应用程序都适用。

🔎

延伸解读

DNS优化:HTTPDNS与预解析的实践要点

文章指出,运营商劫持、解析失败、首次访问慢是常见DNS问题。引入HTTPDNS是首选方案,但需注意:若HTTPDNS未返回结果,应先使用系统解析,避免业务等待。同时,监听网络变化及时刷新DNS,并在App启动时预解析域名,能有效减少延迟。这些措施尤其适合使用CDN的场景。

HTTP优化:从协议升级到连接池复用

在HTTP优化方面,文章建议接入HTTPDNS、压缩请求头与数据、启用HTTP/2协议以利用多路复用和头部压缩。同时,合理使用Cache-Control、断点续传和分片上传。特别强调避免多次创建OkHttpClient,而应共享ConnectionPool和Dispatcher,以充分利用连接池,提升网络效率。

WebView优化:多进程与缓存池策略

针对WebView内存占用高、泄漏和加载慢的问题,文章提出多进程隔离、使用MutableContextWrapper创建WebView并及时销毁。预加载WebViewProvider、创建WebView缓存池(注意不要调用destroyed)可加速页面打开。对于白屏/黑屏,需排查JS错误、证书问题,并可通过设置透明度或View不可见来优化加载体验。

网络监控与统一:挑战与可行方案

文章指出网络结构、Cookie存储和监控难以统一。可通过URL.setURLStreamHandlerFactory接管Http(s)URLConnection,但WebView的ajax和Native请求无法完全接管。建议统一使用CookieManager作为Cookie存储,并在OkHttp的CookieJar中对接。监控方面,可利用EventListener、SocketFactory包装或Hook BlockGuardOs来统计流量和接口数据。

❓

Q&A

如何优化Android中的DNS解析?

可以通过引入HTTPDNS、监听网络变化及时更新DNS、预解析DNS等方法来优化DNS解析。

在HTTP请求中,如何处理弱网和无网问题?

对于弱网,可以使用超时和重试逻辑;无网时,建议直接加载本地缓存资源。

WebView的内存占用过高该如何优化?

可以通过使用多进程、预加载和创建WebView缓存池来优化WebView的内存占用。

使用OkHttp时,如何提高网络请求的效率?

可以通过接入HTTPDNS、压缩请求头、使用HTTP2协议和连接池等方法来提高网络请求效率。

在Android中,如何避免DNS解析失败的问题?

可以通过避免使用特殊字符的域名、动态分离静态和动态资源、以及合理选择IP等方式来减少DNS解析失败的风险。

WebView加载缓慢的原因有哪些?

WebView加载缓慢的原因主要包括DNS解析慢、资源加载困难和内存占用过高等。

🏷️

标签

➡️

继续阅读