今天来把RxJava与Retrofit集合起来,进行一些学习
1.Retrofit封装
public class RetrofitClient {
private Retrofit mRetrofit;
private final MovieService mMovieService;
public RetrofitClient(){
mRetrofit = new Retrofit.Builder().baseUrl("https://api.douban.com/v2/movie/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
mMovieService = mRetrofit.create(MovieService.class);
}
public static RetrofitClient getInstance(){
return RetrofitHolder.sClient;
}
public static class RetrofitHolder{
private static RetrofitClient sClient = new RetrofitClient();
}
public<T> T create(Class<T> clazz){
return mRetrofit.create(clazz);
}
// public void getMovieInfo(Subscriber<MovieInfo> subscriber,int start,int count){
// mMovieService.getMovieInfo2(start,count)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(subscriber);
// }
/**
* 用来统一处理Htpp的resultCode,并将data部分的数据剥离出来给Subscriber
* @param <T> Subscribe真正需要的数据类型
*/
class HttpResultFunc<T> implements Func1<HttpResult<T>,T>{
@Override
public T call(HttpResult<T> tHttpResult) {
if(tHttpResult.resultCode!=0){
// throw new ApiException
}
return tHttpResult.subjects;
}
}
public void getMovieInfo(Subscriber<List<MovieInfo.SubjectsBean>> subscriber, int start, int count){
mMovieService.getMovieInfo3(start,count)
.map(new HttpResultFunc<List<MovieInfo.SubjectsBean>>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
2.请求Service
public interface MovieService {
@GET("top250")//https://api.douban.com/v2/movie/top250?start=0&count=10
Call<MovieInfo> getMovieInfo(@Query("start") int start, @Query("count") int count);
@GET("top250")
rx.Observable<MovieInfo> getMovieInfo2(@Query("start") int start, @Query("count") int count);
@GET("top250")
Observable<HttpResult<List<MovieInfo.SubjectsBean>>> getMovieInfo3(@Query("start") int start, @Query("count") int count);
}
3.实体类
public class MovieInfo {
public int count;
public int start;
public int total;
public String title;
public List<SubjectsBean> subjects;
public static class SubjectsBean {
public RatingBean rating;
public String title;
public int collect_count;
public String original_title;
public String subtype;
public String year;
public ImagesBean images;
public String alt;
public String id;
public List<String> genres;
public List<CastsBean> casts;
public List<DirectorsBean> directors;
public static class RatingBean {
public int max;
public double average;
public String stars;
public int min;
}
public static class ImagesBean {
public String small;
public String large;
public String medium;
}
public static class CastsBean {
public String alt;
public AvatarsBean avatars;
public String name;
public String id;
public static class AvatarsBean {
public String small;
public String large;
public String medium;
}
}
public static class DirectorsBean {
public String alt;
public AvatarsBean avatars;
public String name;
public String id;
public static class AvatarsBean {
public String small;
public String large;
public String medium;
@Override
public String toString() {
return "AvatarsBean{" +
"small='" + small + '\'' +
", large='" + large + '\'' +
", medium='" + medium + '\'' +
'}';
}
}
}
}
@Override
public String toString() {
return "MovieInfo{" +
"count=" + count +
", start=" + start +
", total=" + total +
", title='" + title + '\'' +
", subjects=" + subjects +
'}';
}
}
4.统一的实体类
/**
* 为了处理统一的数据格式而建立的统一的实体类
*/
public class HttpResult<T> {
public int count;
public int start;
public int total;
public String title;
public int resultCode;//自己加的
public T subjects;
//当使用Observer对象进行订阅的时候,会自动转成Subscriber对象
// public final Subscription subscribe(final Observer<? super T> observer) {
// if (observer instanceof Subscriber) {
// return subscribe((Subscriber<? super T>)observer);
// }
// return subscribe(new Subscriber<T>() {
//
// @Override
// public void onCompleted() {
// observer.onCompleted();
// }
//
// @Override
// public void onError(Throwable e) {
// observer.onError(e);
// }
//
// @Override
// public void onNext(T t) {
// observer.onNext(t);
// }
//
// });
// }
}
5.MainActivity.java
public class MainActivity extends AppCompatActivity {
@Bind(R.id.textview)
TextView mTextview;
@Bind(R.id.button)
Button mButton;
private Subscriber<MovieInfo> mSubscriber;
private Subscriber mSubscriber1;
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick(R.id.button)
public void click() {
getMovie();
}
public void getMovie() {
Toast.makeText(this, "执行", Toast.LENGTH_SHORT).show();
// MovieService movieService = RetrofitClient.getInstance().create(MovieService.class);
//使用Retrofit
// Call<MovieInfo> movieInfo = movieService.getMovieInfo(0, 10);
// movieInfo.enqueue(new Callback<MovieInfo>() {
// @Override
// public void onResponse(Call<MovieInfo> call, Response<MovieInfo> response) {
// mTextview.setText(response.body().toString());
// }
//
// @Override
// public void onFailure(Call<MovieInfo> call, Throwable t) {
// mTextview.setText(t.getMessage());
// }
// });
//使用RxJava
// movieService.getMovieInfo2(0, 10)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new Subscriber<MovieInfo>() {
// @Override
// public void onCompleted() {
// Toast.makeText(MainActivity.this, "complete", Toast.LENGTH_SHORT).show();
// }
// @Override
// public void onError(Throwable e) {
//
// }
// @Override
// public void onNext(MovieInfo movieInfo) {
// mTextview.setText(movieInfo.toString());
// }
// });
//RxJava封装
// mSubscriber = new Subscriber<MovieInfo>() {
//
// @Override
// public void onCompleted() {
// Toast.makeText(MainActivity.this, "compelete", Toast.LENGTH_SHORT).show();
// }
//
// @Override
// public void onError(Throwable e) {
// }
//
// @Override
// public void onNext(MovieInfo movieInfo) {
// mTextview.setText(movieInfo.toString());
// }
// };
// RetrofitClient.getInstance().getMovieInfo(mSubscriber,0,10);
//封装统一的实体类请求
mSubscriber1 = new Subscriber<List<MovieInfo.SubjectsBean>>(){
@Override
public void onCompleted() {
Toast.makeText(MainActivity.this, "完成", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(MainActivity.this, "e" + e, Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(List<MovieInfo.SubjectsBean> subjectsBeen) {
mTextview.setText(subjectsBeen.toString());
}
};
RetrofitClient.getInstance().getMovieInfo(mSubscriber1,0,10);
mSubscriber.unsubscribe();//取消订阅,取消Http请求
}
}
最后给出请求的接口地址
https://api.douban.com/v2/movie/top250?start=0&count=10