對okhttp的簡單封裝

之前學習安卓的時候一直使用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());

            }
        });

轉載註明出處哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章