美文网首页
[由浅入深]Android网络框架Okhttp封装

[由浅入深]Android网络框架Okhttp封装

作者: 27efec53a72d | 来源:发表于2017-12-15 01:20 被阅读14次

一、简单封装

HttpInterface

/**
 * 作者: 麦典威
 * 修改时间:2017/12/13 22:27
 * 功能: 网络请求接口
 */


public interface HttpInterface {

    void sendGet(String url, Map<String, Object> map, Class c, int where);

    void sendPost(String url, Map<String, Object> map, Class c, int where);

    void sendJsonPost(String url, Class cRequest, Class cResponse, int where);

    void uplosdFile(String url, String localPath, Class c, int where);
}

HttpCallback

/**
 * 作者: 麦典威
 * 修改时间:2017/12/13 22:28
 * 功能: 网络请求回调接口
 */


public interface HttpCallback {

    void onSuccess(Object obj, int where);

    void onError(String msg, int where);
}

OkhttpCallback

/**
 * 作者: 麦典威
 * 修改时间:2017/12/13 22:51
 * 功能: 网络请求回调类
 */


public class OkhttpCallback implements Callback {

    Class c;
    HttpCallback callback;
    int where;

    public OkhttpCallback(Class c, HttpCallback callback, int where) {
        this.c = c;
        this.callback = callback;
        this.where = where;
    }

    @Override
    public void onFailure(Call call, IOException e) {
        callback.onError(e.toString(), where);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        String json = response.body().string();
        Object obj = new Gson().fromJson(json, c);
        callback.onSuccess(obj, where);
    }
}

OkhttpImp

/**
 * 作者: 麦典威
 * 修改时间:2017/12/13 22:30
 * 功能: 网络请求封装工具类
 */


public class OkhttpImp implements HttpInterface {

    OkHttpClient okHttpClient;
    HttpCallback callback;
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    public static final MediaType MEDIA = MediaType.parse("application/octet-stream");

    public OkhttpImp(HttpCallback callback) {
        okHttpClient = new OkHttpClient();
        this.callback = callback;
    }

    @Override
    public void sendGet(String url, Map<String, Object> map, Class c, int where) {
        Request request = new Request.Builder()
                .url(url)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new OkhttpCallback(c, callback, where));
    }

    @Override
    public void sendPost(String url, Map<String, Object> map, Class c, int where) {
        FormBody.Builder builder = new FormBody.Builder();
        for (String key : map.keySet()) {
            Object obj = map.get(key);
            builder.add(key, String.valueOf(obj));
        }
        RequestBody body = builder.build();

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new OkhttpCallback(c, callback, where));
    }

    @Override
    public void sendJsonPost(String url, Class cRequest, Class cResponse, int where) {
        String str = com.alibaba.fastjson.JSON.toJSONString(cRequest);
        RequestBody body = RequestBody.create(JSON, str);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new OkhttpCallback(cResponse, callback, where));
    }


    @Override
    public void uplosdFile(String url, String localPath, Class c, int where) {
        File file = new File(localPath);
        RequestBody body = new MultipartBody.Builder()
                .addFormDataPart("file", file.getName(), RequestBody.create(MEDIA, file))
                .build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new OkhttpCallback(c, callback, where));
    }
}

NetTestAct

/**
 * 作者: 麦典威
 * 修改时间:2017/12/13 23:24
 * 功能: 网络框架测试类
 */


public class NetTestAct extends AppCompatActivity implements HttpCallback {

    private final static int RESP_TESTPOST = 1001;
    OkhttpImp okhttpImp;


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

        okhttpImp = new OkhttpImp(this);
        testPost();
    }

    private void testPost() {
        Map map = new HashMap<String, String>();
        map.put("phone", "17186769808");
        map.put("key", "13d317xxxxxxxx2aee4");
        okhttpImp.sendPost("http://apis.juhe.cn/mobile/get", map, PhoneNumLocBean.class, RESP_TESTPOST);
    }

    @Override
    public void onSuccess(Object obj, int where) {
        switch (where) {
            case RESP_TESTPOST:
                PhoneNumLocBean bean = (PhoneNumLocBean) obj;
                Log.e("onSuccess", bean.toString());
                break;
        }
    }

    @Override
    public void onError(String msg, int where) {
        Log.d("onError", msg);
    }
}

二、结合单例模式、工厂模式封装

未完待续

三、结合反射封装

未完待续

相关文章

网友评论

      本文标题:[由浅入深]Android网络框架Okhttp封装

      本文链接:https://www.haomeiwen.com/subject/byeoixtx.html