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

今天闲来无事,把网络框架简单的回调封装了一下,其实这种方法比较简单,相信很多人都会了,新手朋友可以了解一下。如果你使用的是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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anonymous-OS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值