今天闲来无事,把网络框架简单的回调封装了一下,其实这种方法比较简单,相信很多人都会了,新手朋友可以了解一下。如果你使用的是AndroidStudio开发的话,你可能知道studio使用Okhttp的版本目前是3.2,到底有什么区别呢?下面来看一下
4、OkHttpClient的单例模式
3.0之前的代码
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormEncodingBuilder().add("platform", "android").build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});
3.0之后的代码
OkHttpClient client = new OkHttpClient();
FormBody body = new FormBody.Builder().add("username", "zhangsan").build();
Request request = new Request.Builder().url("").post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});
洪洋大神已经对okhttp做了很好的封装,功能很强大,但是有时候我们需要对如何封装做一定的了解,本文我采用一个比较简单的二次回调来提供一个思路,当然,功能比起洪洋大神的简直不值得一提,废话不多说,上代码:
1、我们需要一个回调接口来自定义实现网络请求成功的逻辑:
/**
* 回调接口
*/
public interface OnDataFinish {
void OnSuccess(String result);
}
2、简单的get方法:
/**
* OkHttp的get请求
*/
static void OkHttpGet(final Context context, String url, final OnDataFinish onDataFinish) {
request = new Request.Builder().url(url).build();
//通过单例模式或得到OkHttpClient的实例
OkHttpUtil.getClientInstance().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(context, "服务器连接异常!", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//网络请求成功得到的结果
final String result = response.body().string();
//注意:这里成功之后的方法是在异步线程中实现的,我们没法直接回调给Activity更新UI,但是我们可以回调给Activity之后再Activity中通过Handler实现,更新新UI,但是是不是很麻烦呢?我们直接在这里进行了处理
handler.post(new Runnable() {
@Override
public void run() {
onDataFinish.OnSuccess(result);
}
});
}
});
}
3、简单的post方法(和get差不多,只是多了一个RequestBody参数用来存放提交的数据):
/**
* OkHttp的post请求
*/
static void OkHttpPost(final Context context, String url, RequestBody body, final OnDataFinish onDataFinish) {
request = new Request.Builder().url(url).post(body).build();
OkHttpUtil.getClientInstance().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(context, "服务器连接异常!", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onDataFinish.OnSuccess(result);
}
});
}
});
}
4、OkHttpClient的单例模式
/**
* OkHttpClient单例对象实例
*/
public static OkHttpClient getClientInstance() {
if (client == null) {
synchronized (OkHttpUtil.class) {
if (client == null) {
client = new OkHttpClient();
}
}
}
return client;
}
整体的代码预览:
import android.content.Context;
import android.os.Handler;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by Administrator on 2016/4/5 0005.
*/
public abstract class OkHttpUtil {
private static OkHttpClient client;
private static Request request;
private static Handler handler = new Handler();
/**
* OkHttp的get请求
*/
static void OkHttpGet(final Context context, String url, final OnDataFinish onDataFinish) {
request = new Request.Builder().url(url).build();
OkHttpUtil.getClientInstance().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(context, "服务器连接异常!", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onDataFinish.OnSuccess(result);
}
});
}
});
}
/**
* OkHttp的post请求
*/
static void OkHttpPost(final Context context, String url, RequestBody body, final OnDataFinish onDataFinish) {
request = new Request.Builder().url(url).post(body).build();
OkHttpUtil.getClientInstance().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(context, "服务器连接异常!", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
onDataFinish.OnSuccess(result);
}
});
}
});
}
/**
* 回调接口
*/
public interface OnDataFinish {
void OnSuccess(String result);
}
/**
* OkHttpClient单例对象实例
*/
public static OkHttpClient getClientInstance() {
if (client == null) {
synchronized (OkHttpUtil.class) {
if (client == null) {
client = new OkHttpClient();
}
}
}
return client;
}
}
5、工具类的调用:
//如果是get请求就没有必要构造FormBody参数体 </span>
FormBody body = new FormBody.Builder().add("name", "111222").build();
OkHttpUtil.OkHttpPost(MainActivity.this,url, body, new OkHttpUtil.OnDataFinish() {
@Override
public void OnSuccess(final String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
});
这样封装有什么好处:看起来好像没什么用,但是这样确实是减少了很大部分的代码,如果你有需要,也可以直接在get或者post方法中加入progress进度条,在activity调用的时候传进一个参数,这样就可以整体把控了,里面的意义还得读者自己去领会。
如果你明白了这个思路,那么有很多的方法都可以用二次回调封装来实现,这里就不一一做出说明了。