Okttp3.0简单的二次回调封装

来源:互联网 发布:如何看待人工智能 编辑:程序博客网 时间:2024/05/24 01:15
今天闲来无事,把网络框架简单的回调封装了一下,其实这种方法比较简单,相信很多人都会了,新手朋友可以了解一下。如果你使用的是AndroidStudio开发的话,你可能知道studio使用Okhttp的版本目前是3.2,到底有什么区别呢?下面来看一下

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