Twitter Kit for AndroidのレスポンスをRxJavaっぽいインターフェースで扱う

Twitter Kit for AndroidはAPIの呼び出しにRetrofit2を使っており、レスポンスはRxJavaのObservableではなくCallが返ってきます。

StatusesService.java
@GET("/1.1/statuses/home_timeline.json?" +
        "tweet_mode=extended&include_cards=true&cards_platform=TwitterKit-13")
Call<List<Tweet>> homeTimeline(@Query("count") Integer count,
                               @Query("since_id") Long sinceId,
                               @Query("max_id") Long maxId,
                               @Query("trim_user") Boolean trimUser,
                               @Query("exclude_replies") Boolean excludeReplies,
                               @Query("contributor_details") Boolean contributeDetails,
                               @Query("include_entities") Boolean includeEntities);

一方でTwitter以外のAPIの呼び出しにはRxJavaを使っており、2種類の呼び出し方が混ざってしまうのが気になるなあと思っていました。

こちらの記事ではレスポンスがObservableを返すようカスタマイズする方法が紹介されています。

はじめは私もこの方法でやろうと思ったのですが、Observableを扱いたいというよりコード上の見た目が整えば良いくらいの認識だったので、もう少し簡単な方法を考えてみました。

subscribeメソッドを持ったクラスを作成する

onNextとonErrorをラムダで受け取れるsubscribeメソッドを持ったクラスを作成して置き換えることを考えます。

名前は便宜的にRetrofitObserverとしました。

RetrofitObserver.java
public class RetrofitObserver<T> {
    private final Call<T> call;

    public RetrofitObserver(Call<T> call) {
        this.call = call;
    }

    public static <T> RetrofitObserver<T> create(Call<T> call) {
        return new RetrofitObserver(call);
    }

    public void subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {
        call.enqueue(new Callback<T>() {
            @Override
            public void success(Result<T> result) {
                try {
                    onNext.accept(result.data);
                } catch (Exception ex) {
                    Exceptions.throwIfFatal(ex);
                    RxJavaPlugins.onError(ex);
                }
            }

            @Override
            public void failure(TwitterException e) {
                try {
                    onError.accept(e);
                } catch (Exception ex) {
                    Exceptions.throwIfFatal(ex);
                    RxJavaPlugins.onError(new CompositeException(e, ex));
                }
            }
        });
    }
}

Retrofit2のCallを引数にcreateし、subscribeでチェーンするような使い方です。

StatusesService statusesService = TwitterCore.getInstance().getApiClient().getStatusesService();

Call<List<Tweet>> call = statusesService.homeTimeline(50, null, null, false, false, false, true);

RetrofitObserver
        .create(call)
        .subscribe(data -> {
            // success
        }, throwable -> {
            // failure
        });

これで以前より見た目が整いました。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.