上一篇
安卓向服务器发送请求
- 行业动态
- 2025-04-24
- 2
安卓通过HTTP/HTTPS协议,使用OkHttp等网络库,向服务器发起请求并解析响应
安卓网络请求基础
权限配置
在AndroidManifest.xml
中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
网络线程要求
Android禁止在主线程(UI线程)中执行网络请求,需通过子线程或异步任务处理。
常用网络请求方式对比
方式 | 特点 | 适用场景 |
---|---|---|
HttpURLConnection | 原生API,需手动管理连接、参数、流操作 | 简单请求,无第三方库依赖 |
OkHttp | 高效、支持缓存、拦截器、自动重试 | 复杂请求,性能优先 |
Retrofit | 基于OkHttp,通过注解生成接口,支持JSON转换、协程 | RESTful API,快速开发 |
Volley | 轻量级,支持JSON、图像加载,内置缓存机制 | 小型项目,简单数据交互 |
OkHttp实现示例
添加依赖
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
基本GET请求
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 jsonData = response.body().string(); // 解析JSON数据 } } });
POST请求带参数
RequestBody body = new FormBody.Builder() .add("username", "test") .add("password", "123456") .build(); Request postRequest = new Request.Builder() .url("https://api.example.com/login") .post(body) .build();
Retrofit实现示例
添加依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
定义接口
public interface ApiService { @GET("users/{id}") Call<User> getUser(@Path("id") int userId); @POST("login") Call<Token> login(@Field("username") String username, @Field("password") String password); }
创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class);
异步调用
apiService.getUser(123).enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { if (response.isSuccessful()) { User user = response.body(); // 处理数据 } } @Override public void onFailure(Call<User> call, Throwable t) { // 处理失败 } });
数据解析与错误处理
JSON解析
- 使用
Gson
或Moshi
将JSON映射为Java对象。 - Retrofit内置
GsonConverterFactory
,自动完成解析。
- 使用
错误处理
- 网络错误:捕获
IOException
,提示用户检查网络。 - 服务器错误:检查
response.code()
,如404
或500
。 - 数据解析错误:捕获
JsonSyntaxException
,提示数据格式异常。
- 网络错误:捕获
常见问题与优化
问题 | 解决方案 |
---|---|
内存泄漏 | 使用静态单例OkHttpClient ,避免频繁创建;Retrofit Service建议短生命周期 |
SSL证书验证 | 配置OkHttpClient 的SSLSocketFactory ,或信任特定证书 |
大文件下载 | 使用OkHttp 的Stream 分块读取,避免一次性加载到内存 |
并发请求管理 | 通过OkHttp 的Dispatcher 限制并发数,或使用Retrofit 的CallAdapter |
相关问题与解答
问题1:如何选择OkHttp和Retrofit?
- OkHttp:适合需要精细控制请求的场景(如自定义拦截器、缓存策略)。
- Retrofit:适合RESTful API,通过注解快速生成接口,减少模板代码。
问题2:如何处理多个并发请求?
- 方案1:使用
OkHttpClient
的Dispatcher
设置最大并发数:OkHttpClient client = new OkHttpClient.Builder() .dispatcher(new Dispatcher()) .build();
- 方案2:在Retrofit中结合
RxJava
或LiveData
管理并发:apiService.getUser(1).enqueue(/ ... /); apiService.getUser(2).enqueue(/ ... /); // 自动并发执行