对okhttp的简单封装

来源:互联网 发布:js window对象的方法 编辑:程序博客网 时间:2024/06/05 12:41

之前学习安卓的时候一直使用xutils进行网络请求和图片加载,很是强大,后来换了okhttp,但是它的封装性略低,请求个网络代码一大堆,所以就进行简单的封装,新手可以学习一下回调的使用

代码

public class MyHttpUtil {    private static OkHttpClient mOkHttpClient;    public static void doGet(String url, final MyHttpResult httpResult){        if(mOkHttpClient==null){            mOkHttpClient=new OkHttpClient();        }        Request.Builder requestBuilder = new Request.Builder().url(url);//在此处添加url        //可以省略,默认是GET请求        requestBuilder.method("GET",null);        Request request = requestBuilder.build();        Call mcall= mOkHttpClient.newCall(request);        mcall.enqueue(new Callback() {            @Override            public void onFailure(Call call, final IOException e) {                ThreadUtils.runOnMainThread(new Runnable() {                    @Override                    public void run() {                        if(httpResult!=null){                            httpResult.onFailure(e);                        }                    }                });            }            @Override            public void onResponse(Call call, final Response response) throws IOException {                final String result = response.body().string();                ThreadUtils.runOnMainThread(new Runnable() {                    @Override                    public void run() {                        if(httpResult!=null){                                httpResult.onResponse(result);                        }                    }                });            }        });    }    public interface MyHttpResult{        public void onFailure(IOException e);        public void onResponse(String response);    }}

总结

只封装了异步get请求,其他方式的请求也类似吧,其中okhttp原本的callback是在子线程中进行的,所以就无法在其中更新界面了,在这里我在主线程中采用回调,这样就可以直接在callback中更新界面了^_^
其中运行在子线程中的方法用到了另一个自定义工具类,代码如下

public class ThreadUtils {    //使用主线程的looper创建handler 这个handler一定执行在主线程的    private static Handler handler = new Handler(Looper.getMainLooper());   private static Executor executor = Executors.newSingleThreadExecutor();    /**     * 在子线程中执行代码     * @param r     */    public static void runOnNonUIThread(final Runnable r){       new Thread(){           @Override           public void run() {               r.run();           }       }.start();    }    /**     * 在主线程中执行代码     * @param r     */    public static void runOnMainThread(Runnable r){        handler.post(r);    }}

注释写的很清楚了,

使用例子

 MyHttpUtil.doGet("http://www.baidu.com", new MyHttpUtil.MyHttpResult() {            @Override            public void onFailure(IOException e) {            }            @Override            public void onResponse(String response) {                    System.out.println("result"+response);                  //  Log.i("result",response.body().string().toString());            }        });

转载注明出处哦

原创粉丝点击