自Android 6.0之后,HttpClient被废,好多APP是不是出现蛋疼的事,赶紧换掉网络请求框架。兼容6.0版本。但是想换网络请求不是一件容易的事。你会发现有多好地方调用了此网络请求。想彻底换掉得折腾一番。再者,好多时候。因为网上的网络框架很多。xutils、Okhttp、Retrofit等等。在迭代过程中,发现想换个网络框架使用。是一个很蛋疼的事。所以我们为了解决这一痛点,打造一个通用的引擎。
网络请求一般也就是下面几步
1、选择请求方式
2、穿入请求地址以及请求参数
3、网络请求成功与否的回调
public interface IHttpEngine {
/**
* post请求
* @param url
* @param params
* @param httpCallBack
*/
void post(String url , Map params , HttpCallBack httpCallBack);
/**
* get请求
* @param url
* @param params
* @param httpCallBack
*/
void get(String url , Map 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的具体使用步骤:https://github.com/wyouflf/xUtils3 这里就不做介绍了
实现我们引擎接口
public class XUtilsHttpEngine implements IHttpEngine{
@Override
public void post(String url, Map params, final HttpCallBack httpCallBack) {
// 封装url参数
RequestParams requestParams = new RequestParams(url);
Iterator> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
requestParams.addParameter(entry.getKey(),entry.getValue());
}
x.http().post(requestParams, new Callback.CommonCallback() {
@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 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 params , HttpCallBack httpCallBack){
httpEngine.post(url , params ,httpCallBack);
}
/**
* get请求
* @param url
* @param params
* @param httpCallBack
*/
public void get(String url , Map 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 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() {
@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();
}
});
}
}
public class OkHttpEngine implements IHttpEngine{
@Override
public void post(String url, Map params, final HttpCallBack httpCallBack) {
FormBody.Builder body = new FormBody.Builder();
Iterator> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry 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 params, HttpCallBack httpCallBack) {
}
}
这里我可能只是贴出了POST请求,而get请求以及下载、上传等等都没有去贴出来。你是我想说的是学编程学习的是别人的思想,如果思想领悟,加上动手才会收货更多。
源码地址