RxJavaとRetrofitを組み合わせて使用

9186 ワード

前言:この間RxJavaとRetrofit 2を少し時間をかけて勉強しましたが、その後は実践の中で使われていませんでした.今日見ると、ええと、ほとんど忘れてしまいました.ここでまとめて記録しておきます.ここで豆弁の映画インタフェースを呼び出して、いくつかのデータURLを引き出します.https://api.douban.com/v2/movie/
一、Retrofit 2のみでネットワーク要求1を開始する.対応するURLにJavaインタフェースを定義する
public interface MovieService {

    @GET("top250")//start,count       
    Call getTopMovie(@Query("start") int start, @Query("count") int count);

}

2.Reprofitインスタンス呼び出しインタフェースでインスタンスを作成する
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(url)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
MovieService movieService = retrofit.create(MovieService.class);

リクエストの開始
Call call = movieService.getTopMovie(0, 10);
call.enqueue(new Callback() {
      @Override
      public void onResponse(Call call, Response response) {
          Toast.makeText(getBaseContext(), "success=" + response.body().toString(), Toast.LENGTH_SHORT).show();
      }

      @Override
      public void onFailure(Call 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とRetrofit 2を併用1.インタフェース対応のJavaインタフェースを以下のように修正
public interface MovieService {

//    @GET("top250")
//    Call getTopMovie(@Query("start") int start, @Query("count") int count);

    @GET("top250")
    Observable>> getTopMovie(@Query("start") int start, @Query("count") int count);

}

2.発起ネットワーク要求修正は以下の通りであり、Retrofit 2のCallコールバックを用いず、RxJavaの非同期通知メカニズムを変更する
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
MovieService movieService = retrofit.create(MovieService.class);
//Call call = movieService.getTopMovie(0, 10);
//call.enqueue(new Callback() {
//@Override
//public void onResponse(Call call, Response response) {
//    Toast.makeText(getBaseContext(), "success=" + response.body().toString(), Toast.LENGTH_SHORT).show();
//}
//
//@Override
//public void onFailure(Call 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>>() {
          @Override
          public void onCompleted() {
          }

          @Override
          public void onError(Throwable e) {

          }

          @Override
          public void onNext(HttpResult> listHttpResult) {
              Toast.makeText(getBaseContext(), "result=" + listHttpResult.getTitle(), Toast.LENGTH_SHORT).show();
          }
      });

3.使用するHttpResult,Subject.ここでは、以前のMovieEntity HttpResultの代わりにこの2つのクラスを使用します.java
public class HttpResult {

    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 genres;
    private List casts;
    private List 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 getGenres() {
        return genres;
    }

    public void setGenres(List genres) {
        this.genres = genres;
    }

    public List getCasts() {
        return casts;
    }

    public void setCasts(List casts) {
        this.casts = casts;
    }

    public List getDirectors() {
        return directors;
    }

    public void setDirectors(List 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'
}

参照リンク:http://gank.io/post/56e80c2c677659311bed9841DEMOダウンロード