做Android开发,绕不开网络请求。不管是加载一张图片,还是提交用户登录信息,背后都是网络编程接口在跑。很多人一开始觉得难,其实摸清套路后,写起来挺顺手。
从最简单的HTTP请求开始
现在大多数App都用RESTful API和服务器通信。比如你做个天气App,要从后台拿城市气温数据,基本就是一个GET请求的事。用OkHttp这类库,几行代码就能搞定。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/weather?city=shanghai")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String responseData = response.body().string();
// 在这里处理返回的数据
}
}
});
注意,网络操作不能在主线程执行,不然会ANR。上面用了enqueue异步调用,响应结果回到主线程更新UI时,记得用Handler或者runOnUiThread。
用Gson简化数据解析
服务器返回的大多是JSON,手动解析容易出错又啰嗦。配合Gson,可以直接把JSON映射成Java对象。比如天气接口返回:
{
"city": "上海",
"temperature": 22,
"status": "晴"
}
定义一个类:
public class Weather {
String city;
int temperature;
String status;
}
然后在回调里加一句:
Gson gson = new Gson();
Weather weather = gson.fromJson(responseData, Weather.class);
数据立马就能用,省事不少。
上传文件也常见
比如用户要传头像,就得用POST带文件。OkHttp支持Multipart请求,构造起来也不复杂。
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "avatar.jpg",
RequestBody.create(MediaType.parse("image/jpeg"), file))
.addFormDataPart("userId", "12345")
.build();
Request request = new Request.Builder()
.url("https://api.example.com/upload")
.post(requestBody)
.build();
进度监听稍微麻烦点,得自己包装RequestBody,但网上有现成的工具类,抄过来改改就行。
别忘了权限和安全
AndroidManifest.xml里加上网络权限是基本操作:
<uses-permission android:name="android.permission.INTERNET" />
如果用HTTPS,确保服务器证书合规。测试阶段用自签名证书容易出问题,可以临时信任,但上线前一定要换回来。
封装一套自己的工具类
项目一大会有很多接口,每个都写一遍OkHttp太累。抽个NetworkClient类,把公共Header、超时时间、错误重试这些统一处理,后期维护轻松很多。比如加个token自动附加:
.addInterceptor(chain -> {
Request original = chain.request();
Request request = original.newBuilder()
.header("Authorization", "Bearer " + getToken())
.method(original.method(), original.body())
.build();
return chain.proceed(request);
})
这种小设计,时间越长越能体会到好处。