天天看點

Okhttputils終極封裝前言:1.添加依賴2.初始化(配置統一頭和攔截器等)3.自定義callback4.抽取方法5.使用網絡請求6.項目源碼

前言:

項目源碼

https://github.com/yulyu2008/XiayuOkHttp

Okhttputils是張鴻洋基于okhhttp封裝的一個架構,使用起來很友善,相信很多人都用到過,這裡我們在這個架構的基礎上二次封裝,讓我們用起來更加友善.

主要功能:

  • 可以添加統一的頭資訊
  • 統一處理異常
  • 自動注入加載動畫(可選)
  • 自動解析bean對象
  • 結合Stetho,調試更友善

1.添加依賴

compile 'com.zhy:okhttputils:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.google.code.gson:gson:2.5'
compile 'com.facebook.stetho:stetho-okhttp3:1.3.1'
debugCompile 'com.facebook.stetho:stetho:1.1.1'
           

2.初始化(配置統一頭和攔截器等)

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new LoggerInterceptor("TAG"))
                .addNetworkInterceptor(new Interceptor() {//自定義攔截器
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request  request  = chain.request();
                        //配置統一的頭
                        Request  newRequest     = request.newBuilder().addHeader("head", "xiayu").build();
                        return  chain.proceed(newRequest);
                    }
                })
                .addNetworkInterceptor( new StethoInterceptor())//增加Stetho攔截器,用于調試
                .connectTimeout(10000L, TimeUnit.MILLISECONDS)
                .readTimeout(10000L, TimeUnit.MILLISECONDS)
                //其他配置
                .build();
        //使用自定義OkHttpClient
        OkHttpUtils.initClient(okHttpClient);

    }
}
           

注意記得在清單檔案中配置Application和網絡權限

Stetho的初始化和使用這裡就不做介紹了,可以參考這篇文章

FaceBook調試神器Stetho

http://blog.csdn.net/yulyu/article/details/54980871

3.自定義callback

public abstract class XiayuCallBack<T> extends Callback<T> {
    Class mClass;
    private Context        mContext;
    private boolean        mIsShowDialog;
    private ProgressDialog progressDialog;
    private Request        mRequest;
    public static Gson mGson = new Gson();

    public XiayuCallBack(Class targetClazz, Context context, boolean isShowDialog) {
        mClass = targetClazz;
        mContext = context;
        mIsShowDialog = isShowDialog;
    }

    public XiayuCallBack(Class<T> targetClazz, Context mContext) {
        this(targetClazz, mContext, false);//預設不開啟動畫
    }


    @Override
    public T parseNetworkResponse(Response response, int id) throws Exception {
        T t = null;
        try {
            //解析json,傳回bean對象
            t = (T) mGson.fromJson(response.body().string(), mClass);
        } catch (JsonSyntaxException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return t;
    }

    @Override
    public void onError(Call call, Exception e, int id) {
        //在這裡做異常統一處理
        System.out.println("onError");
        myError(call, e, id);
    }

    public abstract void myError(Call call, Exception e, int id);

    @Override
    public void onBefore(Request request, int id) {
        //這裡開啟動畫
        mRequest = request;
        if (mIsShowDialog && mContext != null) {
            if (progressDialog == null) {
                progressDialog = new ProgressDialog(mContext);
                progressDialog.setCancelable(false);
            }
            if (mContext instanceof Activity && !((Activity) mContext).isFinishing()) {
                progressDialog.show();
            }
        }
        super.onBefore(request, id);
    }

    @Override
    public void onAfter(int id) {
        //這裡結束動畫
        try {
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onAfter(id);
    }

}
           

4.抽取方法

public class MovieUtils {
    public static void getMovie(int start, int count, XiayuCallBack<MovieEntity> callBack) {
        OkHttpUtils.get()
                .url("https://api.douban.com/v2/movie/top250")
                .addHeader("MovieUtils","start")
                .addParams("start",start+"")
                .addParams("count",count+"")
                .build()
                .execute(callBack);
    }
}
           

5.使用網絡請求

MovieUtils.getMovie(0, 10, new XiayuCallBack<MovieEntity>(MovieEntity.class, this, true) {
            @Override
            public void myError(Call call, Exception e, int id) {
                //失敗
            }

            @Override
            public void onResponse(MovieEntity response, int id) {
                //成功
            }
        });
           

6.項目源碼

https://github.com/yulyu2008/XiayuOkHttp

繼續閱讀