利用Retrofit, RxJava獲取網絡內容

Retrofit & RxJava

關於如何使用Retrofit和RxJava請閱讀參考中的兩篇文章.java

Retrofit處理數據

Retrofit是在何時處理從網絡中獲取到的json數據的呢? 我從幾個使用了Retrofit的項目源代碼尋找了半天, 也沒有找處處理json的相關代碼. 後來才發現, Retrofit中使用.addConverterFactory(GsonConverterFactory.create())其實就是自動添加了json解析, 它會將json數據直接轉換爲java類(即Pojo).web

convertToPojo能夠根據json的內容自動生成Pojo類.json

以豆瓣api爲例

json數據格式

豆瓣正在熱映的json數據格式大體以下:api

DoubanService.java

interface DoubanService {
    @GET("/v2/movie/in_theaters")
    Call<Douban> getList();
}

pojo類

public class Douban {
    @SerializedName(value = "subjects")
    private List<Subjects> subjects;

    ...Getter and Setter..
}
public class Subjects {
    private String id;
    private String title;
    private Rating rating;
}
public class Rating {
    private String min;
    private String max;
    private String stars;

    ...Getter and Setter..
}

處理並顯示數據

public class DoubanRun extends Thread {
    @Override
    public void run() {
        super.run();
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://api.douban.com")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        DoubanService douban=retrofit.create(DoubanService.class);
        Call<Douban> call=douban.getList();

        try {
            Douban d=call.execute().body();
            for (Subjects l:d.getSubjects()){
                 Log.i("TAGGGG",l.getId()+" "+l.getTitle());
            }
        } catch (IOException e) {
            e.printStackTrace();
            Log.i("TAGGGG","ff");
        }
    }
}

結果markdown

26630781 我不是潘金蓮
25726614 神奇動物在哪裏
25793398 海洋奇緣
26365631 沖天火
26596486 名偵探柯南:純黑的惡夢
3025375 奇異博士
26370431 夏威夷之戀
26673217 我是處女座
26696875 最萌身高差
25983044 比利·林恩的中場戰事
22266320 深海浩劫
26876505 怨靈地下室
25921812 驢得水
26598021 航海王之黃
...

配合RxJava

DoubanService.java改成:網絡

interface DoubanService {
    @GET("/v2/movie/in_theaters")
    Observable<Douban> getList();
}

DoubanRun改成:ide

public class DoubanRun extends Thread {

    @Override
    public void run() {
        super.run();

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://api.douban.com")
                .addConverterFactory(GsonConverterFactory.create())
                //
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())

                .build();

        DoubanService doubanService=retrofit.create(DoubanService.class);

        doubanService.getList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Douban>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Douban douban) {
                        for (Subjects l:douban.getSubjects()){
                            Log.i("TAGGGG",l.getId()+" "+l.getTitle());

                        }
                    }
                });
    }
}

注意點

  1. 出現Expected BEGIN_ARRAY but was BEGIN_OBJECT at或者pojo類中對應的變量的類型不對. 好比 若是在Subjects類中將rating設爲String. 就會有Expected String but was BEGIN_OBJECT at...錯誤.

參考文章

  1. 給 Android 開發者的 RxJava 詳解
    archive.org備份頁面
  2. RxJava 與 Retrofit 結合的最佳實踐
    archive.org備份頁面
相關文章
相關標籤/搜索