關於如何使用Retrofit和RxJava請閱讀參考中的兩篇文章.java
Retrofit是在何時處理從網絡中獲取到的json數據的呢? 我從幾個使用了Retrofit的項目源代碼尋找了半天, 也沒有找處處理json的相關代碼. 後來才發現, Retrofit中使用.addConverterFactory(GsonConverterFactory.create())
其實就是自動添加了json解析, 它會將json數據直接轉換爲java類(即Pojo).web
convertToPojo能夠根據json的內容自動生成Pojo類.json
豆瓣正在熱映的json數據格式大體以下:api
DoubanService.java
interface DoubanService {
@GET("/v2/movie/in_theaters")
Call<Douban> getList();
}
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 航海王之黃
...
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());
}
}
});
}
}
Expected BEGIN_ARRAY but was BEGIN_OBJECT at
或者pojo類中對應的變量的類型不對. 好比 若是在Subjects
類中將rating設爲String. 就會有Expected String but was BEGIN_OBJECT at...
錯誤.