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 }
あなたの回答
tips
プレビュー