前言:前段时间花了点时间学了一下RxJava和Retrofit2,后面在实践中被没有用到,今天一看,呃,都基本上忘掉了。
在这里总结记录一下。
这里调用豆瓣的电影接口拉取一些数据
URL:https://api.douban.com/v2/movie/
一、只用Retrofit2发起网络请求
1.给对应的URL定义一个Java接口
public interface MovieService {
@GET("top250")//start,count 是接口的参数
Call<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);
}
2.用Retrofit 实例调用接口
创建实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
MovieService movieService = retrofit.create(MovieService.class);
发起请求
Call<MovieEntity> call = movieService.getTopMovie(0, 10);
call.enqueue(new Callback<MovieEntity>() {
@Override
public void onResponse(Call<MovieEntity> call, Response<MovieEntity> response) {
Toast.makeText(getBaseContext(), "success=" + response.body().toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<MovieEntity> call, Throwable t) {
Toast.makeText(getBaseContext(), "error=" + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
用到的实体类
public class MovieEntity implements Serializable {
private Long mId;
private String mTitle;
private String mSummary;
public Long getmId() {
return mId;
}
public void setmId(Long mId) {
this.mId = mId;
}
public String getmTitle() {
return mTitle;
}
public void setmTitle(String mTitle) {
this.mTitle = mTitle;
}
public String getmSummary() {
return mSummary;
}
public void setmSummary(String mSummary) {
this.mSummary = mSummary;
}
}
二、用RxJava与Retrofit2配合使用
1.把接口对应的Java接口修改如下
public interface MovieService {
// @GET("top250")
// Call<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);
@GET("top250")
Observable<HttpResult<List<Subject>>> getTopMovie(@Query("start") int start, @Query("count") int count);
}
2.发起网络请求修改如下,不用Retrofit2的Call回调了,改用RxJava的异步通知机制
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MovieService movieService = retrofit.create(MovieService.class);
//Call<MovieEntity> call = movieService.getTopMovie(0, 10);
//call.enqueue(new Callback<MovieEntity>() {
//@Override
//public void onResponse(Call<MovieEntity> call, Response<MovieEntity> response) {
// Toast.makeText(getBaseContext(), "success=" + response.body().toString(), Toast.LENGTH_SHORT).show();
//}
//
//@Override
//public void onFailure(Call<MovieEntity> call, Throwable t) {
// Toast.makeText(getBaseContext(), "error=" + t.getMessage(), Toast.LENGTH_SHORT).show();
//}
//});
movieService.getTopMovie(0, 1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<HttpResult<List<Subject>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(HttpResult<List<Subject>> listHttpResult) {
Toast.makeText(getBaseContext(), "result=" + listHttpResult.getTitle(), Toast.LENGTH_SHORT).show();
}
});
3.用到的HttpResult,Subject。这里用这两个类代替了之前的MovieEntity
HttpResult.java
public class HttpResult<T> {
private int count;
private int start;
private int total;
private String title;
private T subjects;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public T getSubjects() {
return subjects;
}
public void setSubjects(T subjects) {
this.subjects = subjects;
}
}
Subject.java
public class Subject {
private String id;
private String alt;
private String year;
private String title;
private String original_title;
private List<String> genres;
private List<Cast> casts;
private List<Cast> directors;
private Avatars images;
@Override
public String toString() {
return "Subject.id=" + id
+ " Subject.title=" + title
+ " Subject.year=" + year
+ " Subject.originalTitle=" + original_title + casts.toString() + directors.toString() + " | ";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAlt() {
return alt;
}
public void setAlt(String alt) {
this.alt = alt;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getOriginal_title() {
return original_title;
}
public void setOriginal_title(String original_title) {
this.original_title = original_title;
}
public List<String> getGenres() {
return genres;
}
public void setGenres(List<String> genres) {
this.genres = genres;
}
public List<Cast> getCasts() {
return casts;
}
public void setCasts(List<Cast> casts) {
this.casts = casts;
}
public List<Cast> getDirectors() {
return directors;
}
public void setDirectors(List<Cast> directors) {
this.directors = directors;
}
public Avatars getImages() {
return images;
}
public void setImages(Avatars images) {
this.images = images;
}
private class Cast {
private String id;
private String name;
private String alt;
private Avatars avatars;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAlt() {
return alt;
}
public void setAlt(String alt) {
this.alt = alt;
}
public Avatars getAvatars() {
return avatars;
}
public void setAvatars(Avatars avatars) {
this.avatars = avatars;
}
@Override
public String toString() {
return "cast.id=" + id + " cast.name=" + name + " | ";
}
}
private class Avatars {
private String small;
private String medium;
private String large;
public String getSmall() {
return small;
}
public void setSmall(String small) {
this.small = small;
}
public String getMedium() {
return medium;
}
public void setMedium(String medium) {
this.medium = medium;
}
public String getLarge() {
return large;
}
public void setLarge(String large) {
this.large = large;
}
}
}
用到的依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.jakewharton:butterknife:7.0.1'
}