Android打造一个通用的网络请求引擎HttpUtils

打造一个通用的网络请求引擎HttpUtils

  • 为什么要打造这个引擎
  • Xutils的引擎
  • Okhttp的引擎
  • 使用

为什么要打造这个引擎

自Android 6.0之后,HttpClient被废,好多APP是不是出现蛋疼的事,赶紧换掉网络请求框架。兼容6.0版本。但是想换网络请求不是一件容易的事。你会发现有多好地方调用了此网络请求。想彻底换掉得折腾一番。再者,好多时候。因为网上的网络框架很多。xutils、Okhttp、Retrofit等等。在迭代过程中,发现想换个网络框架使用。是一个很蛋疼的事。所以我们为了解决这一痛点,打造一个通用的引擎。

从网络请求谈起

网络请求一般也就是下面几步

1、选择请求方式
2、穿入请求地址以及请求参数
3、网络请求成功与否的回调

第一步:我们写这样一个引擎接口IHttpEngine

public interface IHttpEngine {

    /**
     * post请求
     * @param url
     * @param params
     * @param httpCallBack
     */
    void post(String url , Map<String,String> params , HttpCallBack httpCallBack);

    /**
     * get请求
     * @param url
     * @param params
     * @param httpCallBack
     */
    void get(String url , Map<String,String> params , HttpCallBack httpCallBack);

}

第二步:我们写自己的一个请求成功与否的回调

这里我们既想要拿到网络请求返回的json串,又想拿到解析后的对象。这个自己考虑,至少我觉得这样似乎更合理一些

public abstract class HttpCallBack<T> {

    /**
     *
     * @param resultjson 请求成功返回的json串
     * @param result 解析好的对象
     *
     * 直接解析好的可操作对象 返回对象不明确,所以这个地方我们需要使用泛型
     */
    public abstract void onSuccess(String resultjson , T result);

    public abstract void onFail(Throwable ex);

}

第三步:打造我们自己想要的引擎(Xutils)

xutils的具体使用步骤:https://github.com/wyouflf/xUtils3 这里就不做介绍了
实现我们引擎接口

public class XUtilsHttpEngine implements IHttpEngine{


    @Override
    public void post(String url, Map<String, String> params, final HttpCallBack httpCallBack) {
        //  封装url参数
        RequestParams requestParams = new RequestParams(url);

        Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,String> entry = (Map.Entry) iterator.next();
            requestParams.addParameter(entry.getKey(),entry.getValue());
        }

        x.http().post(requestParams, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {// 主线程

                // 获取泛型的类型
                Type genType = httpCallBack.getClass().getGenericSuperclass();
                Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
                Class typeClass = (Class) params[0];

                httpCallBack.onSuccess(result,GsonUtils.jsonToObject(result,typeClass));
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                httpCallBack.onFail(ex);
            }

            @Override
            public void onCancelled(CancelledException cex) {
            }

            @Override
            public void onFinished() {
            }
        });
    }

    @Override
    public void get(String url, Map<String, String> params, HttpCallBack httpCallBack) {

    }
}

第四步:引擎已打造完毕,我们现在想要使用该怎么办?

1、可能有些同学会说,直接new XUtilsHttpEngine 对象,调里面的方法不就可以了嘛。确实这样是可以使用的。但是你会发现我们想要修改成其他网络框架还是那么困难。根本就没有达到我们期望的效果。

2、所以这里我们创建一个HttpUtils的类,通过new 这个类,来调里面的方法。之后我们想要切换使用OKhttp。只需要在这个类中的构造方法中。创建OKhttp的引擎即可httpEngine = new OkHttpEngine();。

public class HttpUtils {

    private IHttpEngine httpEngine;

    public static Handler handler = new Handler();

    public HttpUtils() {

        //这里用来切换引擎
//        httpEngine = new XUtilsHttpEngine();
        httpEngine = new OkHttpEngine();
    }


    /**
     * post请求
     * @param url
     * @param params
     * @param httpCallBack
     */
    public void post(String url , Map<String,String> params , HttpCallBack httpCallBack){
        httpEngine.post(url , params ,httpCallBack);
    }

    /**
     * get请求
     * @param url
     * @param params
     * @param httpCallBack
     */
    public void get(String url , Map<String,String> params , HttpCallBack httpCallBack){
        httpEngine.get(url , params ,httpCallBack);
    }
}

使用

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void login(View view){
        doLogin();
    }

    private void doLogin() {
        HttpUtils httpUtils = new HttpUtils();
        Map<String , String> params = new HashMap<>();
        String url = "http://huyong.viewcreator3d.cn/index.php/Api/Ayhyy/admin_login";
        params.put("admin_name","18601135484");
        params.put("admin_password","888888");
        params.put("sign","ayhyyayhyyayhyy");
        httpUtils.post(url, params, new HttpCallBack<UserInfo>() {
            @Override
            public void onSuccess(String resultjson, UserInfo userinfo) {
                Toast.makeText(MainActivity.this,resultjson+"用户名"+userinfo.info.user_info.admin_name,Toast
                        .LENGTH_SHORT)
                        .show();
            }

            @Override
            public void onFail(Throwable ex) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

把okHttp的引擎贴出来。想要使用只需要在HttpUtils这个类中的构造方法修改即可

public class OkHttpEngine implements IHttpEngine{


    @Override
    public void post(String url, Map<String, String> params, final HttpCallBack httpCallBack) {

        FormBody.Builder body = new FormBody.Builder();

        Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String,String> entry = (Map.Entry) iterator.next();
            body.add(entry.getKey(),entry.getValue());
        }
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(body.build())
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                httpCallBack.onFail(e);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                // 获取泛型的类型
                Type genType = httpCallBack.getClass().getGenericSuperclass();
                Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
                final Class typeClass = (Class) params[0];

                final String result = response.body().string();

                HttpUtils.handler.post(new Runnable() {
                    @Override
                    public void run() {
                        // 把它弄到主线程中
                        httpCallBack.onSuccess(result,GsonUtils.jsonToObject(result,typeClass));
                    }
                });

            }
        });
    }

    @Override
    public void get(String url, Map<String, String> params, HttpCallBack httpCallBack) {

    }
}

总结

这里我可能只是贴出了POST请求,而get请求以及下载、上传等等都没有去贴出来。你是我想说的是学编程学习的是别人的思想,如果思想领悟,加上动手才会收货更多。

附源码

源码地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值