上一篇
安卓与服务器建立连接
- 行业动态
- 2025-04-24
- 7
安卓通过HTTP/HTTPS协议与服务器建立连接,需配置网络权限,使用OkHttp/Retrofit等库发起请求,处理异步回调及异常,确保数据传输
安卓与服务器建立连接的实现方式
网络权限配置
安卓应用需在 AndroidManifest.xml
中声明网络权限:
<uses-permission android:name="android.permission.INTERNET" />
注意:Android 6.0+ 需动态申请敏感权限(如定位权限可能间接影响网络状态判断)。
HTTP 请求实现方式
使用 HttpURLConnection
// 示例:发送 GET 请求 URL url = new URL("https://example.com/api/data"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); // 连接超时 5秒 connection.setReadTimeout(5000); // 读取超时 5秒 int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); // 读取输入流(如 JSON 解析) } else { // 处理错误码(如 404、500) } connection.disconnect();
使用第三方库(OkHttp / Retrofit)
库名 | 特点 | 适用场景 |
---|---|---|
OkHttp | 轻量级,支持缓存、拦截器 | 简单请求、文件上传 |
Retrofit | 基于 OkHttp,支持注解、自动解析 JSON | 复杂 API 接口调用 |
OkHttp 示例:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://example.com/api/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 json = response.body().string(); // 解析 JSON } } });
SSL 证书处理
信任自签名证书(开发环境)
// 忽略证书校验(仅限测试环境) connection.setSSLSocketFactory(new InsecureSSLSocketFactory()); connection.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; // 直接信任所有证书 } });
HTTPS 双向认证(生产环境)
- 将服务器公钥导入客户端(通过
KeyStore
)。 - 配置
SSLSocketFactory
并验证服务器证书。
异步处理网络请求
方式 | 优点 | 缺点 |
---|---|---|
AsyncTask | 简单易用,UI 线程回调 | 生命周期依赖 Activity |
Handler+Thread | 灵活控制线程,可复用 | 代码较繁琐 |
线程池 | 高效管理线程,适合多任务 | 需手动处理线程同步 |
Coroutine | 简洁异步代码,避免回调地狱 | 需 Kotlin 支持 |
Kotlin Coroutine 示例:
GlobalScope.launch(Dispatchers.IO) { val result = runBlocking { // 模拟网络请求 // 执行网络操作 } withContext(Dispatchers.Main) { // 更新 UI } }
错误处理与网络状态检查
常见错误类型
错误类型 | 触发原因 | 处理方式 |
---|---|---|
SocketTimeout | 网络延迟或服务器无响应 | 重试机制 + 超时配置 |
UnknownHost | 域名解析失败(如断网) | 提示用户检查网络 |
SSLHandshake | 证书不匹配或被改动 | 校验证书或替换可信证书 |
网络状态检查
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); boolean isConnected = networkInfo != null && networkInfo.isConnected();
相关问题与解答
Q1:如何实现大文件上传并显示进度?
A:
- 使用
MultipartBody
(OkHttp/Retrofit)或分块上传(HttpURLConnection
)。 - 监听输出流写入进度,通过
ProgressListener
更新 UI。 - 示例(OkHttp):
RequestBody fileBody = RequestBody.create(mediaType, file); ProgressRequestBody body = new ProgressRequestBody(fileBody, progress -> { // 更新进度条(需切换到主线程) });
Q2:如何在后台持续保持与服务器的连接?
A:
- 使用
JobScheduler
(API 21+)或WorkManager
(支持全版本)定期拉取数据。 - 通过
Service
结合Socket
实现长连接(如 WebSocket)。 - 示例(WorkManager):
PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, 15, TimeUnit.MINUTES) .build(); WorkManager.getInstance(context).enqueue(work);