PagingDataは、デフォルトでPaging 3ライブラリのバックグラウンドスレッドで実行されますか?

アダム・ハーウィッツ

バックグラウンドスレッドPagingDataは、同じように自動的に管理さPagedListれ、メインスレッドに戻されますか?

以下のログPagingDataからPagedList、ページング2のライブラリと比較して、ページング3ライブラリのバックグラウンドスレッドでは実行されていないようです。

期待するページングCodelabサンプルに基づく

  • override suspend fun load(...)IOスレッドで実行するGithubPagingSource
  • viewModel.searchRepo(query).collectLatest { ... }メインスレッドで実行するSearchRepositoriesActivity

観察する

  • GithubPagingSource override suspend fun load(...)SearchRepositoriesActivityの 両方viewModel.searchRepo(query).collectLatest { ... }がメインスレッドで実行されます。

ページング2

スレッド化はドキュメントに従ってPagedListtoLiveDataによってバックグラウンドで処理されます

LivePagedListBuilderを使用してLiveDataを取得すると、バックグラウンドスレッドでPagedListsが初期化されます。

ページング3

ページング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ます。ただし、ログにはPagingSourceFeedPagingSource.ktのメインスレッドでの実行が引き続き表示さます

FeedViewModel.kt

repository.initFeed().onEach {
            println("Thread: FeedViewModel ${Thread.currentThread().name}")
            _feed.value = it
}.flowOn(Dispatchers.IO).launchIn(viewModelScope)
アダム・ハーウィッツ

Kotlinコルーチン

上記のサンプルコードのように、Kotlinコルーチンを実装PagingDataPagingSourceてRetrofitネットワークリクエストを行う場合、Retrofitはデフォルトでバックグラウンドスレッドを処理し、メインスレッドに戻ります。

StackOverflow:Retrofitはメインスレッドでネットワーク呼び出しを行いますか?を参照してください

RxJava

ネットワークソースとしてRetrofitを使用してRxJavaを使用する場合、Androidのドキュメントサンプルに示されているように、スレッドを明示的に指定する必要があります。

Androidのドキュメントを参照してください:ネットワークとデータベースからのページ> RemoteMediatorを実装する

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

バックグラウンドjsスクリプトはChromeOSアプリの別のスレッドで実行されますか?

分類Dev

成功と失敗のリスナーメソッドはバックグラウンドスレッドで実行されますか?

分類Dev

RxJavaの間隔演算子:IOスレッドでサブスクライブしているため、コードのどの部分がバックグラウンドスレッドで実行されますか

分類Dev

ステップカウンターはデフォルトでバックグラウンドで実行されていますか?

分類Dev

Pythonスクリプトはファイルに書き込まずにバックグラウンドで実行されますか?

分類Dev

NSManagedObjectContext performBlockAndWait:バックグラウンドスレッドで実行されませんか?

分類Dev

iOSアプリケーションはデフォルトでバックグラウンドモードで実行されます

分類Dev

完了ハンドラクロージャは常にバックグラウンドスレッドで実行されていますか?

分類Dev

Open Libertyの開発モードはフォアグラウンドまたはバックグラウンドで実行されますか

分類Dev

AsyncTaskはいつバックグラウンドで実行されますか?

分類Dev

Android PhoneStateListenerはバックグラウンドで実行されますか?

分類Dev

jq --streamはバックグラウンドで実行されますか?

分類Dev

Swift 3でバックグラウンドスレッドを実行する

分類Dev

FirefoxはSelenideのバックグラウンドで実行されます

分類Dev

bashスクリプトは、バックグラウンドで実行されているかどうかをどのように検出できますか?

分類Dev

アプリケーションがバックグラウンドで実行されたときにスレッドが強制終了されましたか?

分類Dev

出力をログファイルにリダイレクトし、同時にプロセスをバックグラウンドで実行できますか?

分類Dev

あなたのウェブサイトがバックグラウンドで実行されているかどうかを検出します

分類Dev

DispatchQueueの使用中にSwiftでメインスレッドから実行中のバックグラウンドスレッドの実行を停止する方法

分類Dev

デフォルトでバックグラウンドでbashスクリプトを実行する

分類Dev

バックグラウンドでスレッドを実行し、OpenMPでメインを続行します

分類Dev

バックグラウンドスレッドでNSBlockOperationの直後にメインスレッドでブロックを実行する

分類Dev

パイプされたbashスクリプトをバックグラウンドで実行する

分類Dev

デバイスがロックされている場合、またはアプリがバックグラウンドで実行されている場合、App Storeのアプリはキーチェーンにアクセスできますか?

分類Dev

アクションのディスパッチは、reactフローのバックグラウンドで実行されますか?

分類Dev

長時間実行されるバックグラウンド作業でHTTPリクエストのタイムアウトを防止します

分類Dev

RAMにはアクティブなものだけを保持しながら、バックグラウンドで実行されているアイドル状態のソフトウェアのメモリ データをスワップするために転送しますか?

分類Dev

バックグラウンドで実行されるインタラクティブスクリプトに引数を渡す

分類Dev

バックグラウンドで実行されるインタラクティブスクリプトに引数を渡す

Related 関連記事

  1. 1

    バックグラウンドjsスクリプトはChromeOSアプリの別のスレッドで実行されますか?

  2. 2

    成功と失敗のリスナーメソッドはバックグラウンドスレッドで実行されますか?

  3. 3

    RxJavaの間隔演算子:IOスレッドでサブスクライブしているため、コードのどの部分がバックグラウンドスレッドで実行されますか

  4. 4

    ステップカウンターはデフォルトでバックグラウンドで実行されていますか?

  5. 5

    Pythonスクリプトはファイルに書き込まずにバックグラウンドで実行されますか?

  6. 6

    NSManagedObjectContext performBlockAndWait:バックグラウンドスレッドで実行されませんか?

  7. 7

    iOSアプリケーションはデフォルトでバックグラウンドモードで実行されます

  8. 8

    完了ハンドラクロージャは常にバックグラウンドスレッドで実行されていますか?

  9. 9

    Open Libertyの開発モードはフォアグラウンドまたはバックグラウンドで実行されますか

  10. 10

    AsyncTaskはいつバックグラウンドで実行されますか?

  11. 11

    Android PhoneStateListenerはバックグラウンドで実行されますか?

  12. 12

    jq --streamはバックグラウンドで実行されますか?

  13. 13

    Swift 3でバックグラウンドスレッドを実行する

  14. 14

    FirefoxはSelenideのバックグラウンドで実行されます

  15. 15

    bashスクリプトは、バックグラウンドで実行されているかどうかをどのように検出できますか?

  16. 16

    アプリケーションがバックグラウンドで実行されたときにスレッドが強制終了されましたか?

  17. 17

    出力をログファイルにリダイレクトし、同時にプロセスをバックグラウンドで実行できますか?

  18. 18

    あなたのウェブサイトがバックグラウンドで実行されているかどうかを検出します

  19. 19

    DispatchQueueの使用中にSwiftでメインスレッドから実行中のバックグラウンドスレッドの実行を停止する方法

  20. 20

    デフォルトでバックグラウンドでbashスクリプトを実行する

  21. 21

    バックグラウンドでスレッドを実行し、OpenMPでメインを続行します

  22. 22

    バックグラウンドスレッドでNSBlockOperationの直後にメインスレッドでブロックを実行する

  23. 23

    パイプされたbashスクリプトをバックグラウンドで実行する

  24. 24

    デバイスがロックされている場合、またはアプリがバックグラウンドで実行されている場合、App Storeのアプリはキーチェーンにアクセスできますか?

  25. 25

    アクションのディスパッチは、reactフローのバックグラウンドで実行されますか?

  26. 26

    長時間実行されるバックグラウンド作業でHTTPリクエストのタイムアウトを防止します

  27. 27

    RAMにはアクティブなものだけを保持しながら、バックグラウンドで実行されているアイドル状態のソフトウェアのメモリ データをスワップするために転送しますか?

  28. 28

    バックグラウンドで実行されるインタラクティブスクリプトに引数を渡す

  29. 29

    バックグラウンドで実行されるインタラクティブスクリプトに引数を渡す

ホットタグ

アーカイブ