如果你请求网页的返回数据类型是json,那么使用Retrofit将获得极大的便利
比如请求网址是http://gank.io/api/data/福利/10/1
先上效果图
【首先,compile相关库,别忘了Sync Now】
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.jakewharton:butterknife:8.5.1'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.android.support:design:25.3.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
- converter-gson是retrofit内集成的gson工具库,完成api接口java化的东西
- glide是谷歌官方的图片加载库,加载图片代码
Glide.with(content).load(URL).into(imageView);
- butterknife是square开源的注解库,简单而言简化了绑定控件的fuckCode,用它就一定要用它的插件,可以快速绑定视图中的View。bk没有不是不行,但是有一定更好
【继续,完成api接口】
//http://gank.io/api/data/福利/10/1
@GET("{fuli}/10/1")
Call<Gankio> getFuli(@Path("fuli")String owner);
- 将网址分为两部分,http://gank.io/api/data/是固定不变的,
后面 data/福利/10/1 会变的,所以放在GET中,并且这里只对福利处传值处理,其他部分就不动了,还是用path做插值
【继续,完成Retrofit实例化对象】
Retrofit mRetrofit = new Retrofit
.Builder()//谁
.addConverterFactory(GsonConverterFactory.create())//怎么干
.baseUrl(URL)//干什么
.build();//是否干
谁,干什么,怎么干,是否干。
.addConverterFactory(GsonConverterFactory.create())
- 显然,干的内容又丰富了。在获取json的同时,将json与java中的pojo或者说是bean一一对应起来,就是这段代码的意思
【所以,接下来构造pojo(bean)】
- 和bk一样,用gson的话一定要用它的插件,那就是GsonFormat。导入json数据一键生成pojo。
public class Gankio {
private boolean error;
private List<ResultsBean> results;
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
public List<ResultsBean> getResults() {
return results;
}
public void setResults(List<ResultsBean> results) {
this.results = results;
}
public static class ResultsBean {
@Override
public String toString() {
return "ResultsBean{" +
"_id='" + _id + '\'' +
", createdAt='" + createdAt + '\'' +
", desc='" + desc + '\'' +
", publishedAt='" + publishedAt + '\'' +
", source='" + source + '\'' +
", type='" + type + '\'' +
", url='" + url + '\'' +
", used=" + used +
", who='" + who + '\'' +
'}';
}
private String _id;
private String createdAt;
private String desc;
private String publishedAt;
private String source;
private String type;
private String url;
private boolean used;
private String who;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
}
}
如果你细心的看完这段代码,会发现我重写了ResultsBean的toString(),这是为了后续方便展示数据。
【准备发送请求】
GitHubService mGitHubService =
mRetrofit.create(GitHubService.class);
Call<Gankio> call =
mGitHubService.getFuli("福利");
接口类名没变,还是GitHubService
也就是剧本没改,至于演哪一集就要看Call中的泛型了。这里静态传入“福利”,就不折腾了
【执行发送请求】
call.enqueue(new Callback<Gankio>() {
@Override
public void onResponse(Call<Gankio> call,
Response<Gankio> response) {
try {
Gankio mMobileNumber = response.body();
Gankio.ResultsBean mResultsBean =
mMobileNumber.getResults().get(1);
textView.setText(mResultsBean.toString());
Glide.with(Example2.this)
.load(mResultsBean.getUrl())
.into(imageView);
} catch (Exception e) {
textView.setText(e.toString());
}
}
@Override
public void onFailure(Call<Gankio> call,
Throwable t) {
textView.setText(t.toString());
}
});
对关键代码一行行分析
Gankio mMobileNumber = response.body();
- 实例化Gankio并赋值,这里要注意response.body()就已经是<Gankio>了,不要加String()
Gankio.ResultsBean mResultsBean =
mMobileNumber.getResults().get(1);
- 继续实例化ResultsBean并赋值,由于返回的是ResultsBean对象数组,所以添加get(1),选择数组中第2个对象赋值回去,如图
textView.setText(mResultsBean.toString());
- 调用我们刚才重写的toString(),把ResultsBean数组中第2个数据展示在tv中
Glide.with(Example2.this)
.load(mResultsBean.getUrl())
.into(imageView);
- 使用Glide加载图片,URL就是从ResultsBean对象中的getUrl()方法返回的字符串,然后into到ImageView的实例中就可以了