Retrofit封裝

Retrofit結(jié)合Rxjava封裝思路:

  • 主要分為四個(gè)部分:實(shí)體類(lèi) 辛慰,Observable ,Subscriber燕垃,Retrofit裹纳。

實(shí)體類(lèi)

一般客戶端都是通過(guò)鏈接從服務(wù)端獲取數(shù)據(jù),然后再注入到應(yīng)用中棚潦,從而更新UI。返回的數(shù)據(jù)一般為JSON。

{
    items: [],
    has_more: true,
    quota_max: 300,
    quota_remaining: 299
}

常見(jiàn)結(jié)構(gòu)就是如此身弊,對(duì)于我們個(gè)人而言呢有用的僅僅是tems部分,而且后期需求變化的話列敲,items里的json數(shù)據(jù)結(jié)構(gòu)會(huì)發(fā)生改變的阱佛,對(duì)應(yīng)的類(lèi)結(jié)構(gòu)會(huì)發(fā)生改變,所以用泛型來(lái)解決items類(lèi)多變的問(wèn)題戴而。把items中用到的類(lèi)單獨(dú)封裝凑术。

public class StackUserEntity<T> {

    /**
     * items : [{"reputation":904115,"creation_date":1222430705,"user_type":"registered","user_id":22656,"accept_rate":86,"location":"Reading, United Kingdom","website_url":"http://csharpindepth.com","link":"http://stackoverflow.com/users/22656/jon-skeet","profile_image":"https://www.gravatar.com/avatar/6d8ebb117e8d83d74ea95fbdd0f87e13?s=128&d=identicon&r=PG","display_name":"Jon Skeet"}]
     * has_more : true
     * quota_max : 300
     * quota_remaining : 299
     */

    private boolean has_more;
    private int quota_max;
    private int quota_remaining;
    private T items;   
}
Observable<StackUserEntity<List<ItemsBean>>>

Retrofit

此類(lèi)更多封裝的時(shí)關(guān)于Retrofit的配置及請(qǐng)求過(guò)程,并不涉及服務(wù)接口所意。以單例模式封裝淮逊。

public class HttpMethodes{

    public static final String baseUrl = "https://api.douban.com/v2/movie/";

    private static final int DEFAULT_TIMEOUT = 5;

    private Retrofit retrofit;

    private static HttpMethodes httpMethodes;


    //構(gòu)造函數(shù)私有化
    private HttpMethodes() {
        OkHttpClient.Builder builder =new OkHttpClient.Builder();

        builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);


        retrofit = new Retrofit.Builder()
                               .baseUrl(baseUrl)
                               .client(builder.build())
                               .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                               .addConverterFactory(GsonConverterFactory.create())
                               .build();
    }

    //懶漢式單例,并加入線程鎖扶踊,使得線程安全(不會(huì)因?yàn)槎嗑€程調(diào)用時(shí)創(chuàng)造出兩個(gè)實(shí)例)    
    public static  HttpMethodes getInstance() {
        if (httpMethodes == null) {
            synchronized (HttpMethodes.class) {
                if (httpMethodes == null) {
                    httpMethodes = new HttpMethodes();
                }
            }
        }
        return httpMethodes;
    }


    //這里是把線程的調(diào)度封裝了泄鹏,避免重復(fù)寫(xiě)。
    public <T> void getMovie(Subscriber<T> subscriber,Observable<T> observable) {
        toSubscriber(observable,subscriber);
    }


    //因?yàn)槭菃卫鎏矗?wù)接口的對(duì)象創(chuàng)建和url的參數(shù)是不能寫(xiě)死的命满。這里也用泛型。
    public <T> T toService(final Class<T> from) {
        return retrofit.create(from);
    }


    private void toSubscriber(Observable o , Subscriber s) {
        o.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s);
    }
}

Observable

Observable這部分更多的是封裝Retrofit的服務(wù)接口參數(shù)傳遞即事件的處理绣版。因這部分為變化的不可能在Retrofit單例那里封裝胶台。

private Observable<List<ItemsBean>> getSource() {
   return methodes.toService(StackExchangeService.class)
                  .getSource(10) //此處使用map操作符呢是為了提取StackUserEntity實(shí)體類(lèi)部分的List<ItemsBean>;
                   .map(new Func1<StackUserEntity<List<ItemsBean>>, List<ItemsBean>>() {
                        @Override
                        public List<ItemsBean> call(StackUserEntity<List<ItemsBean>> listStackUserEntity) {
                              return listStackUserEntity.getItems();
                           }
                     });
}

Subscriber

創(chuàng)建一個(gè)繼承Subscriber的抽象類(lèi)杂抽,把OnNext( )定義為抽象方法诈唬,因?yàn)镺nNext()方法中,更多的傳遞數(shù)據(jù)給UI使用缩麸。

public abstract class ProgressSubscriber<T> extends Subscriber<T> {

    private SubscriberOnNextListener mSubscriber;

    @Inject
    public Context context;

    private ProgressDialog dialog; 

    public void setmSubscriber(SubscriberOnNextListener mSubscriber) {
        this.mSubscriber = mSubscriber;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    @Override
    public void onStart() {
        showProgressDialog();
        super.onStart();
    }

    @Override
    public void onCompleted() {
        destroyProgress();
        Toast.makeText(context, "當(dāng)前任務(wù)已經(jīng)完成", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError(Throwable e) {
        destroyProgress();
        Toast.makeText(context, "當(dāng)前任務(wù)出現(xiàn)了錯(cuò)誤铸磅,請(qǐng)稍候重試", Toast.LENGTH_SHORT).show();
    }


//可以根據(jù)需求寫(xiě)入正確的類(lèi)型
    @Override
    abstract public void onNext(T t);

    private void destroyProgress() {

        if (dialog!=null) {
            dialog.dismiss();
        }
        dialog = null;
    }


    private void showProgressDialog() {
        if (dialog == null) {
            dialog = new ProgressDialog(context);
            dialog.setCancelable(true);
            dialog.setMessage("正在加載中,請(qǐng)稍候杭朱!");

            dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    if (! isUnsubscribed()) {
                        unsubscribe();  //當(dāng)加載框阅仔,加載完成時(shí)取消對(duì)Observable的訂閱(即關(guān)閉url連接。)
                    }
                }
            });
        }

        if (! dialog.isShowing()) {
            dialog.show();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弧械,一起剝皮案震驚了整個(gè)濱河市八酒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刃唐,老刑警劉巖羞迷,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界轩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衔瓮,警方通過(guò)查閱死者的電腦和手機(jī)浊猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)热鞍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葫慎,“玉大人,你說(shuō)我怎么就攤上這事碍现》郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵昼接,是天一觀的道長(zhǎng)爽篷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)慢睡,這世上最難降的妖魔是什么逐工? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮漂辐,結(jié)果婚禮上泪喊,老公的妹妹穿的比我還像新娘。我一直安慰自己髓涯,他們只是感情好袒啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著纬纪,像睡著了一般蚓再。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上包各,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天摘仅,我揣著相機(jī)與錄音,去河邊找鬼问畅。 笑死娃属,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的护姆。 我是一名探鬼主播矾端,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卵皂!你這毒婦竟也來(lái)了须床?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渐裂,失蹤者是張志新(化名)和其女友劉穎豺旬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柒凉,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡族阅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膝捞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坦刀。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔬咬,靈堂內(nèi)的尸體忽然破棺而出鲤遥,到底是詐尸還是另有隱情,我是刑警寧澤林艘,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布盖奈,位于F島的核電站,受9級(jí)特大地震影響狐援,放射性物質(zhì)發(fā)生泄漏钢坦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一啥酱、第九天 我趴在偏房一處隱蔽的房頂上張望爹凹。 院中可真熱鬧,春花似錦镶殷、人聲如沸禾酱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颤陶。三九已至,卻和暖如春埋心,著一層夾襖步出監(jiān)牢的瞬間指郁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工拷呆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闲坎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓茬斧,卻偏偏與公主長(zhǎng)得像腰懂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子项秉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 我從去年開(kāi)始使用 RxJava 绣溜,到現(xiàn)在一年多了。今年加入了 Flipboard 后娄蔼,看到 Flipboard 的...
    Jason_andy閱讀 5,456評(píng)論 7 62
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評(píng)論 25 707
  • 母親(一百零八) 文||與你相識(shí) 秋雨隔開(kāi)了溫暖 隔不住對(duì)您的思念 冷風(fēng)吹起的日子里 思念又潮起 溫暖的記憶永遠(yuǎn)在...
    與你相識(shí)_40fa閱讀 163評(píng)論 0 4
  • 閑坐后庭空對(duì)花怖喻,持書(shū)無(wú)感思無(wú)涯底哗。 欲寄心事與云雁,不知云雁何處達(dá)锚沸。
    荒蕪的靈性閱讀 114評(píng)論 0 1
  • 好人的缺點(diǎn)就是做了好事不留名跋选,永遠(yuǎn)少一張嘴,讓那些嘴快的人鉆了空子哗蜈,把功勞全占了前标。所以奉勸那些好人該張嘴的時(shí)候要張...
    萬(wàn)花叢中一點(diǎn)紅閱讀 387評(píng)論 2 0