1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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
        });

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?