FunHttp icon indicating copy to clipboard operation
FunHttp copied to clipboard

对Okttp的Get请求的简单封装,处理了网络回调的线程切换,网络结果的Json解析

简介

FunHttp是对Okttp的Get请求的简单封装,处理了网络回调的线程切换

使用姿势

添加依赖

//项目build.gradle
allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

//app模块下的build.gradle
dependencies {
        compile 'com.github.uncleleonfan:funhttp:1.2.1'
}

创建请求

所有的请求必须继承自Request<T>, 泛型T传入网络结果想要解析成的数据类型

public class MVRequest extends Request<List<HomeListItemBean>>{

    public MVRequest(String url, NetworkListener listener) {
        super(url, listener);
    }

    public static MVRequest getRequest(NetworkListener listener) {
        return new MVRequest(URLProviderUtils.getHomeUrl(0, 10), listener);
    }
}

执行请求

MVRequest.getRequest(mListNetworkListener).execute();

监听网络结果

网络结果在主线程被回调

private NetworkListener<List<HomeListItemBean>> mListNetworkListener = new NetworkListener<List<HomeListItemBean>>() {
    @Override
    public void onFailed(String s) {

    }

    @Override
    public void onSuccess(List<HomeListItemBean> result) {
        Toast.makeText(MainActivity.this, "onSuccess " + result.size(), Toast.LENGTH_SHORT).show();
    }
};

OKHttp的Get请求的封装

Request

构造方法

public Request(String url, NetworkListener<T> listener) {
    mUrl = url;
    mNetworkListener = listener;
    mGson = new Gson();
}

执行网络请求

public void execute() {
    NetworkManager.getInstance().sendRequest(this);
}

解析网络响应

public T parseNetworkResponse(String result) {
    Class c = this.getClass();
    ParameterizedType parameterizedType = (ParameterizedType) c.getGenericSuperclass();
    Type actualType = parameterizedType.getActualTypeArguments()[0];
    return mGson.fromJson(result, actualType);
}

NetworkListener

public interface NetworkListener<T> {

	//请求失败的回调
    void onError(String errorMsg);

	//请求失败的回调	
    void onSuccess(T result);
}

NetworkManager

NetworkManager维护一个OkhttpClient的对象来执行网络请求。当收到网络结果后,通过绑定主线程的Handler回调到主线程。

public void sendRequest(final Request funRequest) {
    final okhttp3.Request request = new okhttp3.Request.Builder().url(funRequest.getUrl()).get().build();
    mOkHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, final IOException e) {
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    funRequest.getNetworkListener().onFailed(e.getLocalizedMessage());
                }
            });
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //解析结果在在子线程做
            final Object o = funRequest.parseNetworkResponse(response.body().string());
            //回调网络请求成功,传入解析后的结果
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    funRequest.getNetworkListener().onSuccess(o);
                }
            });
        }
    });
}