文章整理自:http://blog.youkuaiyun.com/lmj623565791/article/details/47911083
OkHttp的基础使用时比较简单的,但是在使用OkHttp的时候我们会写大量的重复代码,所以我们需要对其进行进一步的封装,那么如何封装呢?
这个封装的过程其实也可以用于其他一些类库,网上找到的比较好的类库,往往能满足基本要求,但是有时候我们需要一个更加简便的使用方式或者增加其功能,这个时候我们就需要对其进行封装~
先看不封装之前的OkHttp的get请求
OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>()
{
@Override
public void onError(Request request, Exception e)
{
e.printStackTrace();
}
@Override
public void onResponse(String u)
{
mTv.setText(u);//注意这里是UI线程
}
});
我们需要把它变成这样:
OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>()
{
@Override
public void onError(Request request, Exception e)
{
e.printStackTrace();
}
@Override
public void onResponse(String u)
{
mTv.setText(u);//注意这里是UI线程
}
});
一开始,我自己想的封装思路是自己建一个类去继承OkHttp的某个实现类,但是发现自己并不知道到底该怎么做,现在给出hongyang的方法(部分代码):
下面是get的方法
/**
* 异步的get请求
*
* @param url
* @param callback
*/
private void _getAsyn(String url, final ResultCallback callback)
{
final Request request = new Request.Builder()
.url(url)
.build();
deliveryResult(callback, request);
}
private void deliveryResult(final ResultCallback callback, Request request)
{
mOkHttpClient.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(final Request request, final IOException e)
{
sendFailedStringCallback(request, e, callback);
}
@Override
public void onResponse(final Response response)
{
try
{
final String string = response.body().string();
if (callback.mType == String.class)
{
sendSuccessResultCallback(string, callback);
} else
{
Object o = mGson.fromJson(string, callback.mType);
sendSuccessResultCallback(o, callback);
}
} catch (IOException e)
{
sendFailedStringCallback(response.request(), e, callback);
} catch (com.google.gson.JsonParseException e)//Json解析的错误
{
sendFailedStringCallback(response.request(), e, callback);
}
}
});
}
private void sendFailedStringCallback(final Request request, final Exception e, final ResultCallback callback)
{
mDelivery.post(new Runnable()
{
@Override
public void run()
{
if (callback != null)
callback.onError(request, e);
}
});
}
private void sendSuccessResultCallback(final Object object, final ResultCallback callback)
{
mDelivery.post(new Runnable()
{
@Override
public void run()
{
if (callback != null)
{
callback.onResponse(object);
}
}
});
}
//--------------对外公布的方法------------------------
public static void getAsyn(String url, ResultCallback callback)
{
getInstance()._getAsyn(url, callback);
}
//------------------ResultCallback类---------------
public static abstract class ResultCallback<T>
{
Type mType;
public ResultCallback()
{
mType = getSuperclassTypeParameter(getClass());
}
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class)
{
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public abstract void onError(Request request, Exception e);
public abstract void onResponse(T response);
}
注意这里我们自己自创建的ResultCallback 对象要一直作为参数一级一级往下传,然后在最后我们在OkHttpClient的onResponse和onFailue方法(我们OkHttpClient本身也是有onResponse和onFailue方法回调的,但是我们觉得他自己的不好,所以用我们自己的把它替代掉)里面执行自己传进去的ResultCallback 的onResponse和onError调用,