RetrofitUtils的工具類


title: RetrofitUtils的工具類
date: 2016-10-31 10:33:27
tags: Utils


  • 直接上代碼 ,一個(gè)RetrofitFactory单旁,一個(gè)ApiFactory

    package com.aidebar.retrofitutils.Utils.RetrofitUtils;
    
    import okhttp3.OkHttpClient;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    
    /**
     * @author xzj
     * @date 2016/8/25 09:37.
     * 用于獲取配置好的retrofit對象
     * 需要先調(diào)用setBaseUrl坐榆,如果項(xiàng)目中BaseUrl不變飞蛹,可以寫死
     */
    public class RetrofitFactory {
        private static Retrofit retrofit;
        private static String baseUrl;
    
        public static void setBaseUrl(String url) {
            baseUrl = url;
        }
    
        /**
         * 獲取配置好的retrofit對象來生產(chǎn)Manager對象
         */
        public static Retrofit getRetrofit() {
            if (retrofit == null) {
                if (baseUrl == null || baseUrl.length() <= 0)
                    throw new IllegalStateException("請?jiān)谡{(diào)用getFactory之前先調(diào)用setBaseUrl");
    
                Retrofit.Builder builder = new Retrofit.Builder();
                builder.baseUrl(baseUrl)
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 參考RxJava
                        .addConverterFactory(GsonConverterFactory.create()); // 參考與GSON的結(jié)合
    
                // 參考自定義Log輸出
                OkHttpClient client = new OkHttpClient().newBuilder()
    //                    .addInterceptor(new Interceptor() {     //這個(gè)攔截器是操作請求頭的
    //                        @Override
    //                        public Response intercept(Chain chain) throws IOException {
    //                            Request request = chain.request().newBuilder()
    //                                    .addHeader("version", "123411") //這里就是添加一個(gè)請求頭
    //                                    .build();
    //
    ////                        Buffer buffer = new Buffer();       不依賴下面的Interceptor姑尺,用這三行也能打印出請求體
    ////                        request.body().writeTo(buffer);
    ////                        Log.d(getClass().getSimpleName(), "intercept: " + buffer.readUtf8());
    //
    //                            return chain.proceed(request);
    //                        } 
    //                    })
    //                    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))       //這個(gè)攔截器是用來打印日志的清焕,不穩(wěn)定
                        .build();
                builder.client(client);
                retrofit = builder.build();
            }
            return retrofit;
        }
    }
    
    package com.aidebar.retrofitutils.Utils.RetrofitUtils;
    
    import java.util.HashMap;
    
    /**
     * @author xzj
     * @date 2016/8/25 09:38.
     * 通過定義好的api接口以及Retrofit來生成具體的實(shí)例.
     */
    public class ApiFactory {
        private static ApiFactory factory;
        private static HashMap<String, Object> serviceMap = new HashMap<>();
    
        public static ApiFactory getFactory() {
            if (factory == null) {
                synchronized (ApiFactory.class) {
                    if (factory == null)
                        factory = new ApiFactory();
                }
            }
            return factory;
        }
    
        public <T> T create(Class<T> clz) {
            Object service = serviceMap.get(clz.getName());
            if (service == null) {
                service = RetrofitFactory.getRetrofit().create(clz);
                serviceMap.put(clz.getName(), service);
            }
            return (T) service;
        }
    }
    

    還有2個(gè)是用rxjava進(jìn)行配合的可以選用

package com.aidebar.retrofitutils.Utils.RetrofitUtils;
import android.content.Context;
import android.widget.Toast;

import com.aidebar.retrofitutils.R;
import com.aidebar.retrofitutils.Utils.RetrofitUtils.JsonBean.BaseJsonBean;

import java.net.ConnectException;
import java.net.SocketTimeoutException;

import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;

/**
 * @author xzj
 * @date 2016/8/25 11:07.
 */
public abstract class ResponseSubscriber<T> extends Subscriber<T> {
    private Context mContext;
    
    public ResponseSubscriber(Context context) {
        mContext = context;
    }

    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {
        if (!error(e)) {
            if (e instanceof ConnectException) {
                //網(wǎng)絡(luò)異常
                Toast.makeText(mContext, R.string.network_error,Toast.LENGTH_SHORT).show();
            } else if (e instanceof HttpException) {
                //服務(wù)器異常
                Toast.makeText(mContext, R.string.network_servier_error,Toast.LENGTH_SHORT).show();
            } else if (e instanceof SocketTimeoutException) {
                //網(wǎng)絡(luò)超時(shí)
                Toast.makeText(mContext, R.string.network_timeout,Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(mContext,e.getMessage(),Toast.LENGTH_SHORT).show();
            }
        }

    }

    @Override
    public void onNext(T t) {
        BaseJsonBean data;
        if (t instanceof BaseJsonBean) {
            data = (BaseJsonBean) t;
            if (data.success) {             //服務(wù)端返回的是true
                success(t);
            } else {                        //服務(wù)端返回false并蝗,就是操作異常
                if (!operationError(t, data.errorCode, data.msg)) {    //可以復(fù)寫此方法祭犯,返回true,就用戶自己處理滚停,返回false沃粗,走下面的代碼
                    Toast.makeText(mContext,data.msg,Toast.LENGTH_SHORT).show();
                }
            }
        } else {
            success(t);
        }
    }

    /**
     * 請求成功同時(shí)業(yè)務(wù)成功的情況下會(huì)調(diào)用此函數(shù)
     */
    public abstract void success(T t);

    /**
     * 請求成功但業(yè)務(wù)失敗的情況下會(huì)調(diào)用此函數(shù).
     * @return 空實(shí)現(xiàn),默認(rèn)返回false键畴,執(zhí)行父類方法最盅。 用戶可以復(fù)寫此方法,返回true來自己處理
     */
    public boolean operationError(T t, int errorCode, String message) {
        return  false;
    }

    /**
     * 請求失敗的情況下會(huì)調(diào)用此函數(shù)
     * @return 空實(shí)現(xiàn)起惕,默認(rèn)返回false涡贱,執(zhí)行父類方法。 用戶可以復(fù)寫此方法惹想,返回true來自己處理
     */
    public boolean error(Throwable e) {
        return false;
    }
}

package com.aidebar.retrofitutils.Utils.RetrofitUtils;

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * 用于對網(wǎng)絡(luò)請求的Observable做轉(zhuǎn)換.
 * 配合{@link com.trello.rxlifecycle.ActivityLifecycleProvider#bindToLifecycle()}一起使用
 * 可以將原始Observable綁定至Activity/Fragment生命周期, 同時(shí)聲明在IO線程運(yùn)行, 在main線程接收.
 * 像這樣用 
 * manager.getAds().compose(new ResponseTransformer<>(this.<BaseJsonBean> bindToLifeCycle()));
 */
public class ResponseTransformer<T> implements Observable.Transformer<T, T> {

    private Observable.Transformer<T, T> transformer;

    public ResponseTransformer() {}

    public ResponseTransformer(Observable.Transformer<T, T> t) {
        transformer = t;
        
    }

    @Override
    public Observable<T> call(Observable<T> source) {
        if (transformer != null)
            return transformer.call(source).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread());
        else
            return source.subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末问词,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勺馆,更是在濱河造成了極大的恐慌戏售,老刑警劉巖侨核,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件草穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡搓译,警方通過查閱死者的電腦和手機(jī)悲柱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來些己,“玉大人豌鸡,你說我怎么就攤上這事《伪辏” “怎么了涯冠?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逼庞。 經(jīng)常有香客問我蛇更,道長,這世上最難降的妖魔是什么赛糟? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任派任,我火速辦了婚禮,結(jié)果婚禮上璧南,老公的妹妹穿的比我還像新娘掌逛。我一直安慰自己,他們只是感情好司倚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布豆混。 她就那樣靜靜地躺著篓像,像睡著了一般。 火紅的嫁衣襯著肌膚如雪皿伺。 梳的紋絲不亂的頭發(fā)上遗淳,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音心傀,去河邊找鬼屈暗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脂男,可吹牛的內(nèi)容都是我干的养叛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宰翅,長吁一口氣:“原來是場噩夢啊……” “哼弃甥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汁讼,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淆攻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嘿架,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓶珊,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年耸彪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伞芹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝉娜,死狀恐怖唱较,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情召川,我是刑警寧澤南缓,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站荧呐,受9級(jí)特大地震影響汉形,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坛增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一获雕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧收捣,春花似錦届案、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尽纽。三九已至,卻和暖如春童漩,著一層夾襖步出監(jiān)牢的瞬間弄贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工矫膨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留差凹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓侧馅,卻偏偏與公主長得像危尿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子馁痴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理谊娇,服務(wù)發(fā)現(xiàn),斷路器罗晕,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 簡書 :天天大保建 原文地址: http://www.reibang.com/p/29c2a9ac...
    天天大保建閱讀 1,482評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法济欢,類相關(guān)的語法,內(nèi)部類的語法小渊,繼承相關(guān)的語法法褥,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • Retrofit 源碼解析 簡單用法 Retrofit最簡單的用法就是定義一個(gè)接口粤铭,創(chuàng)建Retrofit對象挖胃,調(diào)用...
    Kingty閱讀 793評論 3 14
  • 25歲的年紀(jì)究竟應(yīng)該做點(diǎn)什么才好呢? 有人會(huì)說繼續(xù)深造讀研考博吗垮,在知識(shí)的海洋里進(jìn)一步翱翔垛吗。 也有人說當(dāng)然是存錢了,...
    青木俠閱讀 419評論 0 0