好处:方便以后调用其中的方法 同时可以不使用handler直接使用 activity.runOnUiThread(new Runnable()…方法进行线程跳转
public class RequestUtil<T> {
private OkHttpClient client = new OkHttpClient();
private static RequestUtil requestUtil;
private final String HOST = "https://v0.yiketianqi.com/api";
private RequestUtil() {
}
// 使用okhttp
public static RequestUtil getInstance() {
if (requestUtil == null) {
requestUtil = new RequestUtil();
}
return requestUtil;
}
public void sendGet(Class<T> cla, Activity activity, Map<String, Object> params, OnRequestCallback<T> onRequestCallback) {
// 拼接url
StringBuilder urlBuilder = new StringBuilder(HOST)
.append("?")
.append("version").append("=").append("v62");
if (params != null && !params.isEmpty()) {
for (Map.Entry entry : params.entrySet()) {
// "https://v0.yiketianqi.com/api?version=v62&appid=56962523&appsecret=1aNInold"
urlBuilder.append("&")
.append(entry.getKey())
.append("=")
.append(entry.getValue());
}
}
Request request = new Request.Builder()
.url(urlBuilder.toString())
.build();
// 采用异步方法
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
e.printStackTrace();
// 跳会到主线程
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
handleError(e.getMessage());
if (onRequestCallback != null) {
// 执行接口的请求失败方法
onRequestCallback.onFailed("");
}
}
});
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
// 请求成功的情况下
String dataStr = response.body().string(); // 接收请求的json数据 注意不能使用toString()会报错
Gson gson = new Gson();
// 得到的T类型data
T data = gson.fromJson(dataStr, cla);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (response.code() != 200) {
if (onRequestCallback != null) {
onRequestCallback.onFailed("request error, code = " + response.code());
}
}
if (onRequestCallback != null) {
onRequestCallback.onSuccess(data);
}
}
});
}
});
}
private void handleError(String errorMsg) {
Log.i(getClass().getSimpleName(), "errorMsg = " + errorMsg);
}
public interface OnRequestCallback<T> {
void onSuccess(T data);
void onFailed(String error);
}
}
调用该方法:可以直接在接口方法内更新UI
Map<String,Object> urlMap = new HashMap<String, Object>();
urlMap.put("appid","56962523");
urlMap.put("appsecret","1aNInold");
RequestUtil.getInstance().sendGet(WeatherData.class, this, urlMap, new RequestUtil.OnRequestCallback<WeatherData>() {
@Override
public void onSuccess(WeatherData data) {
if (data!=null&&realTimeTemperatureAdapter!=null){
WeatherData weatherData = data;
mTvCity.setText(weatherData.city);
mTvTem.setText(weatherData.tem);
mTvTem1.setText(weatherData.tem1);
mTvTem2.setText(weatherData.tem2);
mTvWea.setText(weatherData.wea);
mTvAir.setText(weatherData.air_level);
mTvCountry.setText(weatherData.country);
mTvDate.setText(weatherData.date);
hours = weatherData.hours;
realTimeTemperatureAdapter.updata(hours);
}
}
@Override
public void onFailed(String error) {
}
});