上一篇
安卓开发软件连接网络
- 行业动态
- 2025-04-22
- 3
安卓开发中实现网络连接的常见方式
HTTP/HTTPS请求
核心类与库:
HttpURLConnection
(原生API,较底层)OkHttp
(第三方库,高效易用)Retrofit
(基于OkHttp的RESTful API封装)
权限配置:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
OkHttp基础用法:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.example.com/data") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { / 处理失败 / } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String result = response.body().string(); // 处理结果 } } });
网络状态检测
场景 | 工具类 | 核心方法 |
---|---|---|
判断网络是否可用 | ConnectivityManager | getActiveNetworkInfo().isConnected() |
监听网络变化 | BroadcastReceiver | 注册CONNECTIVITY_CHANGE 事件 |
示例代码:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); boolean isAvailable = info != null && info.isConnected();
异步处理网络请求
传统方式:
AsyncTask
(已过时,但仍有项目使用)Handler + Thread
现代方式:
Coroutine
(Kotlin协程)LiveData
(与ViewModel结合)
协程示例:
GlobalScope.launch(Dispatchers.IO) { val result = withContext(Dispatchers.IO) { // 执行网络请求 } // 切换到主线程更新UI withContext(Dispatchers.Main) { / 更新UI / } }
网络安全配置
HTTPS配置:
- 在
res/xml/network_security_config.xml
中配置:<domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">example.com</domain> </domain-config>
- 在
AndroidManifest.xml
中引用:<application ...> <network-security-config srcCompat="@xml/network_security_config" /> </application>
- 在
证书验证:
- 自签名证书处理:通过
TrustManager
自定义信任策略(需谨慎) - 证书锁定(Certificate Pinning):防止中间人攻击
- 自签名证书处理:通过
性能优化策略
优化方向 | 具体措施 |
---|---|
缓存 | 使用OkHttp缓存或第三方库(如Glide) |
压缩 | 启用GZIP压缩,优化图片加载 |
连接复用 | 使用OkHttp连接池,减少TCP握手 |
流量控制 | 分页加载、按需请求 |
常见问题与解答
问题1:为什么安卓应用出现NetworkOnMainThreadException
?
解答:
安卓从Honeycomb(API 11)开始禁止在主线程执行网络操作,解决方案:
- 使用子线程(如
AsyncTask
、Thread
) - 使用异步框架(如Retrofit、Coroutine)
- 在
Looper.prepare()
中创建Handler(不推荐)
问题2:如何处理HTTP与HTTPS混合请求?
解答:
- 明确协议:优先使用HTTPS,必要时通过配置文件允许明文HTTP。
- 动态适配:根据URL协议自动选择
HttpURLConnection
或HttpsURLConnection
。 - 安全提示:对非HTTPS请求添加风险提示,避免敏感数据