将okhttp请求以及gson处理数据封装成单例模式的util类并设置接口回调 使用map拼接url

好处:方便以后调用其中的方法 同时可以不使用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) {

            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值