バックグラウンドスレッドPagingData
は、と同じように自動的に管理さPagedList
れ、メインスレッドに戻されますか?
以下のログPagingData
からPagedList
、ページング2のライブラリと比較して、ページング3ライブラリのバックグラウンドスレッドでは実行されていないようです。
期待する(ページングCodelabサンプルに基づく)
override suspend fun load(...)
IOスレッドで実行するGithubPagingSource。viewModel.searchRepo(query).collectLatest { ... }
メインスレッドで実行するSearchRepositoriesActivity。観察する
override suspend fun load(...)
とSearchRepositoriesActivityの 両方viewModel.searchRepo(query).collectLatest { ... }
がメインスレッドで実行されます。スレッド化は、ドキュメントに従ってPagedList
とtoLiveData
によってバックグラウンドで処理されます。
LivePagedListBuilderを使用してLiveDataを取得すると、バックグラウンドスレッドでPagedListsが初期化されます。
ページング3のドキュメントには、スレッドの管理方法については記載されていません。ただし、ログから、PagingSource
メインスレッドでネットワーク要求を実行し、メインスレッドでを返しているように見えPagingData
ます。
CryptoTweetsサンプルアプリapp-simpleモジュールでCodelabパターンを再作成しました。
FeedPagingSource.kt
class FeedPagingSource : PagingSource<Int, Tweet>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Tweet> {
try {
val page = params.key ?: 1
val nextPage = page + 1
val tweets = Injection.feedService.getTweets(...)
println("Thread: FeedPagingSource ${Thread.currentThread().name}")
Log.v(LOG_TAG, "load success: ${tweets}")
return LoadResult.Page(...)
} catch (error: Exception) {
...
}
}
}
FeedRepository.kt
class FeedRepository {
fun initFeed() = Pager(
config = PagingConfig(pageSize = FEED_PAGEDLIST_SIZE),
pagingSourceFactory = { FeedPagingSource() }
).flow
}
FeedViewModel.kt
repository.initFeed().onEach {
println("Thread: FeedViewModel ${Thread.currentThread().name}")
_feed.value = it
}.launchIn(viewModelScope)
PagingSource
バックグラウンドスレッドでを実行するために、フローはで開始されDispatchers.IO
ます。ただし、ログにはPagingSource
、FeedPagingSource.ktのメインスレッドでの実行が引き続き表示されます。
FeedViewModel.kt
repository.initFeed().onEach {
println("Thread: FeedViewModel ${Thread.currentThread().name}")
_feed.value = it
}.flowOn(Dispatchers.IO).launchIn(viewModelScope)
上記のサンプルコードのように、Kotlinコルーチンを実装PagingData
しPagingSource
てRetrofitネットワークリクエストを行う場合、Retrofitはデフォルトでバックグラウンドスレッドを処理し、メインスレッドに戻ります。
StackOverflow:Retrofitはメインスレッドでネットワーク呼び出しを行いますか?を参照してください。
ネットワークソースとしてRetrofitを使用してRxJavaを使用する場合、Androidのドキュメントサンプルに示されているように、スレッドを明示的に指定する必要があります。
Androidのドキュメントを参照してください:ネットワークとデータベースからのページ> RemoteMediatorを実装する
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加