添加网络权限
在 AndroidManifest.xml
中声明网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
动态权限申请(Android 6.0+)
若涉及敏感权限(如定位),需在运行时申请:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET}, REQUEST_CODE); }
方式 | 说明 | 适用场景 |
---|---|---|
HttpURLConnection | Android 原生 API,需手动处理连接、流操作、线程管理 | 简单请求,学习原理 |
OkHttp | 第三方库,支持连接池、缓存、拦截器等高级功能 | 中等复杂度项目 |
Retrofit | 基于 OkHttp 的封装,通过注解简化接口调用,支持数据转换(Gson/Jackson) | 复杂项目,快速开发 |
Volley | Google 官方推荐,适合小数据量、高频请求(如列表刷新) | 轻量级网络操作 |
JSON 数据解析
Gson gson = new Gson(); MyDataObject data = gson.fromJson(jsonString, MyDataObject.class);
ObjectMapper mapper = new ObjectMapper(); MyDataObject data = mapper.readValue(jsonString, MyDataObject.class);
异步处理
new Thread(() -> { // 网络请求逻辑 runOnUiThread(() -> { // 更新 UI }); }).start();
GlobalScope.launch(Dispatchers.IO) { val response = makeNetworkCall() withContext(Dispatchers.Main) { // 更新 UI } }
public LiveData<MyDataObject> getData() { MutableLiveData<MyDataObject> liveData = new MutableLiveData<>(); RetrofitClient.getInstance().getApi().fetchData() .enqueue(new Callback<MyDataObject>() { @Override public void onResponse(Call<MyDataObject> call, Response<MyDataObject> response) { liveData.postValue(response.body()); } // 错误处理省略 }); return liveData; }
添加依赖
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
定义 API 接口
public interface ApiService { @GET("path/to/resource") Call<MyDataObject> getData(); }
创建 Retrofit 实例
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/") // 替换为实际域名 .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class);
发送请求并处理响应
apiService.getData().enqueue(new Callback<MyDataObject>() { @Override public void onResponse(Call<MyDataObject> call, Response<MyDataObject> response) { if (response.isSuccessful()) { MyDataObject data = response.body(); // 更新 UI } else { // 处理错误码(如 404) } } @Override public void onFailure(Call<MyDataObject> call, Throwable t) { // 处理网络错误或超时 } });
强制 HTTPS
在 network_security_config.xml
中配置:
<domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">example.com</domain> </domain-config>
防止内存泄漏
ViewModel
或 LifecycleOwner
绑定生命周期。Call.cancel()
)。缓存策略
OkHttpClient client = new OkHttpClient.Builder() .cache(new Cache(context.getCacheDir(), 10 1024 1024)) // 10MB .build();
解答:
使用 DownloadManager
或 OkHttp
的断点续传功能:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setTitle("Downloading"); request.setDescription("File download in progress"); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "filename"); DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); manager.enqueue(request);
Request request = new Request.Builder() .url(url) .addHeader("Range", "bytes=" + downloadedBytes + "-") // 已下载字节数 .build();
解答:
使用 WebSocket 或 长轮询:
OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("wss://example.com/socket").build(); WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { @Override public void onMessage(WebSocket webSocket, String text) { // 处理收到的消息 } });
定时发送心跳请求,保持连接