AndroidManifest权限声明
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
网络线程处理
| 解决方案 | 适用场景 |
|——————-|————————————————————————–|
| AsyncTask | 简单短时任务(已过时,建议使用Jetpack组件) |
| Coroutines | 复杂异步流程(推荐结合Flow使用) |
| WorkManager | 延迟执行/需要保证执行的任务 |
网络库 | 核心特性 | 适用场景 |
---|---|---|
OkHttp | 高效连接池、拦截器、流式上传 | 需要精细控制请求过程的场景 |
Retrofit | 注解式接口、支持多种数据格式、扩展性强 | RESTful API交互 |
Volley | 图片加载、短轮询、内存缓存 | 轻量级网络请求+图片处理 |
HTTPURLConnection | 原生API、无需第三方库 | 极简项目/特殊协议定制 |
// JSON序列化示例(使用Gson) public class ApiService { private final OkHttpClient client = new OkHttpClient(); private final Gson gson = new Gson(); public void postData(String url, Object data) throws IOException { RequestBody body = RequestBody.create( MediaType.parse("application/json"), gson.toJson(data) ); Request request = new Request.Builder() .url(url) .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected code " + response); } } } }
HTTPS证书验证
// OkHttp SSL配置示例 OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new SSLContextBuilder() .setTrustManager(new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}) .build()) .hostnameVerifier((hostname, session) -> true) // 开发环境可临时禁用,生产环境必须开启验证 .build();
数据加密传输
| 加密方式 | 应用场景 | 实现难度 |
|————–|———————————|———-|
| SSL/TLS | 全链路加密 | 低 |
| AES+Base64 | 敏感数据字段级加密 | 中 |
| RSA | 密钥交换/数字签名 | 高 |
// Retrofit错误处理示例 interface ApiService { @POST("api/data") suspend fun sendData(@Body data: RequestBody): Response<Unit> } suspend fun uploadData(data: Data) { try { val response = apiService.sendData(data.toRequestBody()) if (!response.isSuccessful) { when (response.code()) { 400 -> handleBadRequest() 401 -> handleUnauthorized() 500 -> handleServerError() else -> handleGenericError() } } } catch (e: IOException) { handleNetworkError() } catch (e: HttpException) { handleHttpException(e) } }
优化方向 | 实施方案 |
---|---|
连接复用 | OkHttp默认持久连接,设置ConnectionPool(5, 5, TimeUnit.MINUTES) |
请求压缩 | GZIP压缩请求体(需服务器支持) |
缓存策略 | 使用OkHttp缓存或Room数据库离线缓存 |
流量控制 | 分片上传大文件(Chunked Encoding),限制并发请求数 |
Q1:如何测试安卓网络请求功能?
MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse().setBody("{"status":"success"}")); server.start(); // 获取实际端口号进行测试
@Test fun testApiCall() = runBlocking { val mockResponse = mock(Response.class) `when`(mockResponse.isSuccessful).thenReturn(true) // 验证请求参数和回调处理 }
Q2:如何处理大文件上传(如视频/日志文件)?
newMultipartUpload()
或Retrofit的@PartMap
// OkHttp分块上传示例 MultipartBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "log.txt", filePart) .build();
JobIntentService
或WorkManager
保障上传可靠性注意:大文件上传需注意内存占用,建议使用文件流式读取而非一次性加载到内存