Retrofit2和RxJava2搭建Android網(wǎng)絡框架

轉自:http://ranseti.top/article/retrofit2addrxjava2
項目需要compile的資源有

compile 'com.squareup.retrofit2:retrofit:2.3.0'

Retrofit2https://github.com/square/retrofit

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

retrofit2的Rxjava2適配器https://github.com/square/retrofit/tree/master/retrofit-adapters/rxjava2

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

Retrofit2的數(shù)據(jù)轉換器https://github.com/square/retrofit/tree/master/retrofit-converters/gson

以上三個需要保持版本一致,除此還需要

compile 'com.google.code.gson:gson:2.8.2'

google的Gsonhttps://github.com/google/gson

compile "io.reactivex.rxjava2:rxjava:2.1.8"

Rxjavahttps://github.com/ReactiveX/RxJava

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

RxAndroidhttps://github.com/ReactiveX/RxAndroid

compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'

okHttp的log攔截器链蕊,方便調(diào)試https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor



下面直接看代碼

  1. okHttp的配置
public class OkHttpConfigure {

    private static final long TIMEOUT = 30;

    public static OkHttpClient httpClient = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                @Override
                public void log(String message) {
                    Log.i("okHttp", message);
                }
            }).setLevel(HttpLoggingInterceptor.Level.BODY))
            .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
            .readTimeout(TIMEOUT, TimeUnit.SECONDS)
            .build();
}

2.Retrofit配置(我的Demo中用了三個Host主機琼讽,所以配置了三個)

public class RetrofitConfigure {

    /**
     * GitHub配置
     */
    private static final String GitHub_Host = "https://api.github.com";

    public static Retrofit githubRetrofit = new Retrofit.Builder()
            .baseUrl(GitHub_Host)
            .client(OkHttpConfigure.httpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();


    /**
     * 物流100配置
     */
    private static final String WuLiu_Host = "http://www.kuaidi100.com";

    public static Retrofit wuLiuRetrofit = new Retrofit.Builder()
            .baseUrl(WuLiu_Host)
            .client(OkHttpConfigure.httpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();


    /**
     * 圖片下載
     */
    private static String picture_Host = "https://timgsa.baidu.com";

    public static void setPicture_Host(String picture_Host) {
        RetrofitConfigure.picture_Host = picture_Host;
    }

    public static Retrofit pictureRetrofit = new Retrofit.Builder()
            .baseUrl(picture_Host)
            .client(OkHttpConfigure.httpClient)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
}

3.GitHub的Api


public interface GitHubAPI {

    //https://api.github.com/repos/square/retrofit/contributors
    @GET("/repos/{owner}/{repo}/contributors")
    Observable<List<Contributor>> getContributors(@Path("owner") String owner,
                                                  @Path("repo") String repo);

    @GET("/timg?image&quality=80&size=b9999_10000&sec=1517483557140&di=8ef2706c558749c2c9ae999e4401651d&imgtype=0&src=http%3A%2F%2Fimg5.niutuku.com%2Fphone%2F1301%2F5651%2F5651-niutuku.com-446980.jpg")
    Observable<ResponseBody> getcontributorsAvator();

    // !!! 當心大文件乏德,當是大文件時
    @Streaming
    @GET
    Observable<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);

}

4.創(chuàng)建API的實例,定制Observer實現(xiàn)數(shù)據(jù)的異步獲取

public class ConnectHttp<T> {

    //創(chuàng)建 GitHub API 接口的一個實例阵难。
    public static GitHubAPI getGitHubAPI() {
        return RetrofitConfigure.githubRetrofit.create(GitHubAPI.class);
    }

    //創(chuàng)建  WuLiu API 口的一個實例饶套。
    public static WuLiuAPI getWuLiuAPI() {
        return RetrofitConfigure.wuLiuRetrofit.create(WuLiuAPI.class);
    }

    //創(chuàng)建  WuLiu API 口的一個實例漩蟆。
    public static GitHubAPI getPictureAPI() {
        return RetrofitConfigure.pictureRetrofit.create(GitHubAPI.class);
    }

    /**
     * 連接網(wǎng)絡
     * @param observable
     * @param baseObserver
     */
    public static <T> void connect(Observable<T> observable, BaseObserver<T> baseObserver) {
        observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe((baseObserver));
    }
}

5.抽取觀察者,對一些異常進行異常處理

public abstract class BaseObserver<T> implements Observer<T> {

    private Context context;

    public <T> BaseObserver(Context context) {
        this.context = context;
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(@NonNull T t) {
        Log.i("observer",new Gson().toJson(t));
        onResponse(t);
    }

    public abstract void onResponse(T t);

    @Override
    public void onError(@NonNull Throwable e) {
        Log.e("Observer",new Gson().toJson(e));
        if (!NetWorkUtils.isNetworkConnected(context)) {
//            NetWorkSetDialog.showSetNetworkUI(context);
            Toast.makeText(context, "沒有可用的網(wǎng)絡", Toast.LENGTH_LONG).show();
        }
        if (e.getMessage().contains("404")) {
            Toast.makeText(context, "網(wǎng)絡404錯誤", Toast.LENGTH_LONG).show();
        }
        if (e.getMessage().contains("500")) {
            Toast.makeText(context, "網(wǎng)絡500錯誤", Toast.LENGTH_LONG).show();
        }
        if(e instanceof IllegalStateException){
            Toast.makeText(context, "數(shù)據(jù)解析異常", Toast.LENGTH_LONG).show();
        }
        if(e instanceof SocketTimeoutException){
            Toast.makeText(context, "請求超時", Toast.LENGTH_LONG).show();
        }
        e.printStackTrace();
    }

    @Override
    public void onComplete() {
        Log.i("observable", "-----------已完成----------");
    }
}

6.對API進行一次包裝方便調(diào)用

public class GitHubAPIPackage {

    /**
     * 獲取GitHub倉庫貢獻者
     *
     * @param owner
     * @param repo
     * @return
     */
    public static Observable<List<Contributor>> getContributors(String owner, String repo) {
        return ConnectHttp.getGitHubAPI().getContributors(owner, repo);
    }


    /**
     * 下載頭像
     * @return
     */
    public static Observable<ResponseBody> getcontributorsAvator() {
        return ConnectHttp.getPictureAPI().getcontributorsAvator();
    }
}

7.進行調(diào)用

/**
 * 查詢retrofit貢獻者
 */
private void initData() {

        ConnectHttp.connect(GitHubAPIPackage.getContributors("square", "retrofit"),
                new BaseObserver<List<Contributor>>(context) {
                    @Override
                    public void onResponse(List<Contributor> contributors) {
                        //TODO 做你想做的
                    }
                });
}

詳細Demo參考https://github.com/heyl1989/Retrfit2AddRxJava2

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓蛮,一起剝皮案震驚了整個濱河市怠李,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛤克,老刑警劉巖捺癞,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異构挤,居然都是意外死亡髓介,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門筋现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唐础,“玉大人,你說我怎么就攤上這事矾飞∫慌颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵洒沦,是天一觀的道長豹绪。 經(jīng)常有香客問我,道長申眼,這世上最難降的妖魔是什么瞒津? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任蝉衣,我火速辦了婚禮,結果婚禮上巷蚪,老公的妹妹穿的比我還像新娘买乃。我一直安慰自己,他們只是感情好钓辆,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肴焊,像睡著了一般前联。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娶眷,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天似嗤,我揣著相機與錄音,去河邊找鬼届宠。 笑死烁落,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的豌注。 我是一名探鬼主播伤塌,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轧铁!你這毒婦竟也來了每聪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤齿风,失蹤者是張志新(化名)和其女友劉穎药薯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體救斑,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡童本,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脸候。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穷娱。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纪他,靈堂內(nèi)的尸體忽然破棺而出鄙煤,到底是詐尸還是另有隱情,我是刑警寧澤茶袒,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布梯刚,位于F島的核電站,受9級特大地震影響薪寓,放射性物質(zhì)發(fā)生泄漏亡资。R本人自食惡果不足惜澜共,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锥腻。 院中可真熱鬧嗦董,春花似錦、人聲如沸瘦黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幸斥。三九已至匹摇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甲葬,已是汗流浹背廊勃。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留经窖,地道東北人坡垫。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像画侣,于是被迫代替她去往敵國和親冰悠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353