Okttp3.0简单的二次回调封装
来源:互联网 发布:如何看待人工智能 编辑:程序博客网 时间:2024/05/24 01:15
今天闲来无事,把网络框架简单的回调封装了一下,其实这种方法比较简单,相信很多人都会了,新手朋友可以了解一下。如果你使用的是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调用的时候传进一个参数,这样就可以整体把控了,里面的意义还得读者自己去领会。
如果你明白了这个思路,那么有很多的方法都可以用二次回调封装来实现,这里就不一一做出说明了。
点击下载Demo
1 0
- Okttp3.0简单的二次回调封装
- Volley的简单的二次回调封装
- AFN的简单二次封装
- Vollery的简单二次封装
- okhttp简单的二次封装
- retrofit的简单二次封装
- Okhttp的简单二次封装
- Okhttp简单的二次封装
- 简单的Retrofit+Rxjava二次封装
- Retrofit和OkHttp简单的二次封装
- Log简单二次封装
- Volley的简单使用,和简单二次封装
- Android-async-http回调逻辑的二次封装
- Volley简单二次封装代码
- AFN3.0以上版本的二次封装
- AFNetWorking的二次封装
- Volley的二次封装
- glog的二次封装
- LeetCode:最长公共前缀(Longest Common Prefix)
- STL(1) - Lambda表达式
- HBase的按照
- 与时俱进的Java——《写给大忙人看的Java核心技术》
- HDU 3033 I love sneakers!(分组背包/至少选一个)
- Okttp3.0简单的二次回调封装
- Impala简介(整理)
- 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B),win32 error 50
- PHP magic_quotes_gpc的详细使用方法
- Tsinsen A1109 三角形
- 重建二叉树
- java学习笔记(五)
- YD 督促训练 判断这年五一几天假期
- MongoDB用户权限设置