当前位置:首页 > 行业动态 > 正文

安卓如何调用网络数据

安卓网络请求基础配置

添加网络权限

AndroidManifest.xml中声明网络访问权限:

安卓如何调用网络数据  第1张

<uses-permission android:name="android.permission.INTERNET" />

网络线程规范

所有网络请求必须在非主线程执行,避免阻塞UI线程,常用解决方案:

  • AsyncTask(已过时,建议使用Jetpack组件)
  • HandlerThread
  • Coroutine(推荐现代开发方式)
  • WorkManager(适合延迟任务)

主流网络请求实现方式

方式 适用场景 特点
HttpURLConnection 简单GET/POST请求 Android原生API,无需第三方库,适合轻量级请求
OkHttp 复杂网络交互 高效连接池管理,支持WebSocket,广泛兼容
Retrofit RESTful API接口开发 面向接口编程,强类型支持,与OkHttp深度集成
Volley 图片加载/短轮询 内置缓存机制,适合小规模数据交互

代码实现示例

使用HttpURLConnection发送GET请求

// 创建子线程执行网络请求
new Thread(() -> {
    try {
        URL url = new URL("https://api.example.com/data");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        // 读取响应
        InputStream inputStream = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();
        // 回到主线程更新UI
        runOnUiThread(() -> {
            tvResult.setText(response.toString());
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

使用OkHttp发送带Header的POST请求

OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(
    MediaType.parse("application/json"), "{"key":"value"}");
Request request = new Request.Builder()
    .url("https://api.example.com/post")
    .post(body)
    .addHeader("Authorization", "Bearer token")
    .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 {
        final String res = response.body().string();
        runOnUiThread(() -> tvResult.setText(res)); // 更新UI
    }
});

使用Retrofit定义API接口

// 1. 定义接口
public interface ApiService {
    @GET("users/{id}")
    Call<User> getUser(@Path("id") int id);
    @POST("login")
    Call<Token> login(@Body LoginParams params);
}
// 2. 创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();
// 3. 调用接口
ApiService api = retrofit.create(ApiService.class);
Call<User> call = api.getUser(123);
call.enqueue(new Callback<User>() {
    @Override public void onResponse(Call<User> call, Response<User> response) {
        // 处理成功响应
    }
    @Override public void onFailure(Call<User> call, Throwable t) {
        // 处理失败
    }
});

数据解析与异常处理

数据类型 解析工具 示例代码
JSON对象 JSONObject JSONObject json = new JSONObject(response)
JSON数组 JSONArray JSONArray array = json.getJSONArray("data")
复杂对象 Gson/Jackson User user = gson.fromJson(json, User.class)
XML数据 DocumentBuilder Document doc = DocumentBuilderFactory...

异常处理要点:

  • 检查网络连接状态:ConnectivityManager.getActiveNetworkInfo()
  • 处理HTTP错误码:response.code()判断4xx/5xx状态码
  • 超时设置:connection.setConnectTimeout(10, TimeUnit.SECONDS)
  • SSL证书验证:配置SSLSocketFactory或信任所有证书(慎用)

常见问题与优化策略

问题类型 解决方案
内存泄漏 使用静态内部类+弱引用,或生命周期感知组件(LifecycleObserver)
重复请求 使用OkHttp的CacheControl或本地缓存机制
流量优化 压缩数据传输(GZIP)、设置缓存策略、按需加载数据
安全加固 启用HTTPS、证书锁定、数据加密传输

【相关问题解答】

Q1:安卓11及以上系统如何处理后台网络请求?
A1:安卓11引入了更严格的后台网络限制,需注意:

  1. 使用WorkManager替代传统AlarmManager
  2. 申请SCHEDULE_EXACT_ALARM特权(仅限必要场景)
  3. 使用ForegroundService保持网络任务优先级
  4. 优化请求频率,合并网络请求减少功耗

Q2:如何选择合适的网络库?
A2:根据项目需求选择:

  • 简单Demo/快速开发:Volley(内置缓存,适合小数据量)
  • 复杂API对接:Retrofit(强类型,接口化开发)
  • 高性能长连接:OkHttp(支持WebSocket,连接复用)
  • 跨平台方案:Ktor(Kotlin多平台支持)
0