質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
RxJava

RxJavaは、リアクティブプログラミングができるReactiveXのJava向けの実装。軽量であり、その他のライブラリへの依存がなく、RxJavaのjarをパスに通せば使用できます。バージョン2.3からはAndroidもサポートしています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

770閲覧

AndroidのサンプルソースのRxJavaのルールがわからない

KIRIN3

総合スコア28

RxJava

RxJavaは、リアクティブプログラミングができるReactiveXのJava向けの実装。軽量であり、その他のライブラリへの依存がなく、RxJavaのjarをパスに通せば使用できます。バージョン2.3からはAndroidもサポートしています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/06/14 02:02

編集2022/01/12 10:55

Androidのサンプルソースを元にRxJavaでデータ取得するソースを作成したのですが、ルールがわからないところがあります。
どれか一つでもご教示いただけると助かります。

コードは必要部分のみ記載しました。
Presenter ← UseCase ← Repository ← ApiClient
の順でSingleデータを渡しています。

######■疑問点1
PresenterでobserveOn(AndroidSchedulers.mainThread())をセットしているのに
Repositoryで
subscribeOn(Schedulers.io())
observeOn(Schedulers.single())をセットしています。

Presenterでメインスレッドに最後に戻すのはわかるのですが、
Repositoryでの設定がよくわかりません。
バックグラウンド処理のためというのはわかりますが、PresenterでsubscribeOn(Schedulers.io())を呼ばずに、Repositoryでsubscribeを設定して、尚且つ
observeOn(Schedulers.single())の意味も単一のスレッドとのことですが、なぜ設定するのかわかりません。

######■疑問点2
PresenterとUseCaseとRepositoryのdoAfterSuccessの呼ばれる順番が
UseCase → Repository → Presenterの順番です。
どうしてこのような順番になるのでしょうか?
6/15追記:UseCase → Presenter → Repositoryの順番になることもありました。

・Presenter

Kotlin

1 private fun getStockList() { 2 stocksUseCase.loadStockList(userId) 3 .observeOn(AndroidSchedulers.mainThread()) 4 .doOnSubscribe { 5 view.setRefreshingInterface(true) 6 } 7 .doFinally { 8 view.setRefreshingInterface(false) 9 } 10 .doAfterSuccess { 11 // ログ 12 } 13 .subscribe({ result -> 14 // データ表示 15 }, { e -> 16 LOGE("Failed to load StockList ${e.message}") 17 }) 18 .addTo(disposables) 19 }

・UseCase

Kotlin

1 override fun loadStockList( 2 userId: String 3 ): Single<List<StocksResponseData>> { 4 val pageCount = getPageCount() 5 return repository.loadStockList2(userId, pageCount) 6 .doAfterSuccess { 7 addOnePageCount() 8 } 9 }

・Repository

Kotlin

1 fun loadStockList2( 2 userId: String, 3 pageCount: Int 4 ): Single<List<StocksResponseData>> { 5 val api = StocksClient() 6 return api.fetchStocks( 7 retrofitFactory, 8 userId, 9 pageCount.toString(), 10 ONE_TIME_STOCKS_NUM.toString() 11 ) 12 .subscribeOn(Schedulers.io()) 13 .observeOn(Schedulers.single()) 14 .doAfterSuccess { 15 StocksDatabase.insertStocksDataList(it) 16 } 17 }

・ApiClient

Kotlin

1 fun fetchStocks( 2 retrofitFactory: RetrofitFactory, 3 userId: String, 4 page: String, 5 perPage: String 6 ): Single<List<StocksResponseData>> { 7 val requestData: Map<String, String> = mapOf("page" to page, "per_page" to perPage) 8 return getService(retrofitFactory).fetchRepos( 9 userId, 10 retrofitFactory.getHostName(), 11 requestData 12 ) 13 } 14 15 interface StocksService { 16 @GET("api/v2/users/{user_id}/stocks") 17 fun fetchRepos( 18 @Path("user_id") userId: String, 19 @Header("Host") host: String, 20 @QueryMap query: Map<String, String> 21 ): Single<List<StocksResponseData>> 22 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問