Day23-RxJava&Retrofit

RxJava

組成

1. 上游 Observable

2. 下游 多種

無參的subscribe()表示下游不關心數據類型
帶Cunsumer的表示下游只關心 onNext, 其他的裝沒看見

* public final Disposable subscribe() {}
* public final Disposable subscribe(Consumer<? super T> onNext) {}
* public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {}
* public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {}
* public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable> onSubscribe) {}
* public final void subscribe(Observer<? super T> observer) {}

上有和下游之間可以添加各種參數

3. 水管 subscribe

4. 指定上游線程 subscribeOn()

多次指定上游線程, 只有第一次有效

5. 指定下游線程 observeOn()

下游線程可以多次指定

RxJava提供的線程
  • Schedulers.io(), 代表io操作線程, 通常用于網絡/讀寫等密集型操作
  • Schedulers.computation, 代表CPu密集型計算
  • Schedulers.newThread(), 代表一個常規的新線程
  • AndroidSchedulers.mainThread(), 代表Android的主線程
    RxJava內部使用線程池來維護, 所以效率也比較高

AndroidSchedulers.mainThread()是RxAndroid包里的

6.變換操作符

Map

截獲事件水流

FlatMap

比Map更復雜, 將上游的Observable轉化成多個Observable, 然后將他們發射的事件合并后放進一個單獨的Observable里, 但是不保證事件順序

concatMap

保證事件順序的 FlatMap

實踐

Retrofit連續請求

分為兩個請求, 第一個請求, 根據經緯度向百度請求, 拿到轉換出的城市名, 第二個請求, 請求和風天氣, 將城市名轉換成城市名對應的天氣

  1. 準備好百度地圖的城市json對應的bean
public class LocationEntity {

    /**
     * status : OK
     * result : {"location":{"lng":121.490523,"lat":31.407452},"formatted_address":"上海市寶山區牡丹江路1599號","business":"友誼路,北翼商業街,吳淞","addressComponent":{"city":"上海市","direction":"near","distance":"0","district":"寶山區","province":"上海市","street":"牡丹江路","street_number":"1599號"},"cityCode":289}
     */

    private String status;
    private ResultBean result;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public ResultBean getResult() {
        return result;
    }

    public void setResult(ResultBean result) {
        this.result = result;
    }

    public static class ResultBean {
        /**
         * location : {"lng":121.490523,"lat":31.407452}
         * formatted_address : 上海市寶山區牡丹江路1599號
         * business : 友誼路,北翼商業街,吳淞
         * addressComponent : {"city":"上海市","direction":"near","distance":"0","district":"寶山區","province":"上海市","street":"牡丹江路","street_number":"1599號"}
         * cityCode : 289
         */

        private LocationBean location;
        private String formatted_address;
        private String business;
        private AddressComponentBean addressComponent;
        private int cityCode;

        public LocationBean getLocation() {
            return location;
        }

        public void setLocation(LocationBean location) {
            this.location = location;
        }

        public String getFormatted_address() {
            return formatted_address;
        }

        public void setFormatted_address(String formatted_address) {
            this.formatted_address = formatted_address;
        }

        public String getBusiness() {
            return business;
        }

        public void setBusiness(String business) {
            this.business = business;
        }

        public AddressComponentBean getAddressComponent() {
            return addressComponent;
        }

        public void setAddressComponent(AddressComponentBean addressComponent) {
            this.addressComponent = addressComponent;
        }

        public int getCityCode() {
            return cityCode;
        }

        public void setCityCode(int cityCode) {
            this.cityCode = cityCode;
        }

        public static class LocationBean {
            /**
             * lng : 121.490523
             * lat : 31.407452
             */

            private double lng;
            private double lat;

            public double getLng() {
                return lng;
            }

            public void setLng(double lng) {
                this.lng = lng;
            }

            public double getLat() {
                return lat;
            }

            public void setLat(double lat) {
                this.lat = lat;
            }
        }

        public static class AddressComponentBean {
            /**
             * city : 上海市
             * direction : near
             * distance : 0
             * district : 寶山區
             * province : 上海市
             * street : 牡丹江路
             * street_number : 1599號
             */

            private String city;
            private String direction;
            private String distance;
            private String district;
            private String province;
            private String street;
            private String street_number;

            public String getCity() {
                return city;
            }

            public void setCity(String city) {
                this.city = city;
            }

            public String getDirection() {
                return direction;
            }

            public void setDirection(String direction) {
                this.direction = direction;
            }

            public String getDistance() {
                return distance;
            }

            public void setDistance(String distance) {
                this.distance = distance;
            }

            public String getDistrict() {
                return district;
            }

            public void setDistrict(String district) {
                this.district = district;
            }

            public String getProvince() {
                return province;
            }

            public void setProvince(String province) {
                this.province = province;
            }

            public String getStreet() {
                return street;
            }

            public void setStreet(String street) {
                this.street = street;
            }

            public String getStreet_number() {
                return street_number;
            }

            public void setStreet_number(String street_number) {
                this.street_number = street_number;
            }
        }
    }
}
  1. 準備 Rxjava 的 interface
public interface Api {

    @GET("weather")
    Observable<Weather2> getWeatherRx(
            @Query("city")String city,
            @Query("key")String key);

    @GET("geocoder")
    Observable<LocationEntity> getLoation(
            @Query("location") String location,
            @Query("output") String output,
            @Query("key") String key
    );
}
  1. 創建Retrofit
public class RetrofitCreater {

    public static Retrofit createWeather() {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        builder.readTimeout(10, TimeUnit.SECONDS);
        builder.connectTimeout(9, TimeUnit.SECONDS);
        builder.retryOnConnectionFailure(true);//錯誤時重復請求
        builder.connectTimeout(15, TimeUnit.SECONDS);

        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLogger());
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addNetworkInterceptor(interceptor);
        }

        return new Retrofit.Builder().baseUrl("https://free-api.heweather.com/v5/")
                .client(builder.build())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }

    public static Retrofit createLoc() {
        OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        builder.readTimeout(10, TimeUnit.SECONDS);
        builder.connectTimeout(9, TimeUnit.SECONDS);
        builder.retryOnConnectionFailure(true);//錯誤時重復請求
        builder.connectTimeout(15, TimeUnit.SECONDS);

        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLogger());
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addNetworkInterceptor(interceptor);
        }

        return new Retrofit.Builder().baseUrl("http://api.map.baidu.com/")
                .client(builder.build())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }
}
  1. 調用Retrofit
private void requestRxLocation() {
    Retrofit weatherRetrofit = RetrofitCreater.createWeather();
    final Api weatherApi = weatherRetrofit.create(Api.class);
    final Retrofit retrofitLoc = RetrofitCreater.createLoc();
    Api locApi = retrofitLoc.create(Api.class);
    locApi.getLoation("39.90400,116.39100", "json", "6eea93095ae93db2c77be9ac910ff311")
            .flatMap(new Function<LocationEntity, ObservableSource<Weather2>>() {
                @Override
                public ObservableSource<Weather2> apply(LocationEntity locationEntity) throws Exception {
                    Log.i(tag, locationEntity.getResult().getAddressComponent().getCity()+"");
                    return weatherApi.getWeatherRx(locationEntity.getResult().getAddressComponent().getCity(), "你的和風天氣key"); //拿到城市名, 開始請求天氣接口
                }
            }).map(new Function<Weather2, String>() {
                @Override
                public String apply(Weather2 weather2) throws Exception {
                    String text = weather2.getHeWeather5().get(0).getBasic().getCity();
                    return text;
                }
            }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) throws Exception {
                    Log.i(tag,"accept"+s);
                }
            });


}

database

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • 轉載自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657閱讀 2,033評論 1 9
  • 我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,547評論 7 62
  • 怎么如此平靜, 感覺像是走錯了片場.為什么呢, 因為上下游工作在同一個線程呀騷年們! 這個時候上游每次調用emit...
    Young1657閱讀 1,489評論 2 1
  • 前言我從去年開始使用 RxJava ,到現在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導zqq閱讀 9,174評論 6 151
  • 2.17.4.12 星期三 累計73 一、目標: 本期目標實現財富收入50萬元。通過我的目標實現,希望能幫助更多...
    鵲曾閱讀 183評論 0 0