RxJava与Retrofit结合学习

今天来把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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值