gpt4 book ai didi

android - PagingData 在 Paging 3 库中是否默认在后台线程上运行?

转载 作者:行者123 更新时间:2023-12-04 11:35:56 26 4
gpt4 key购买 nike

后台线程是否使用 PagingData 自动管理?与 PagedList 一样,然后在主线程上返回?
从下面的日志中,它出现了 PagingDataPagedList 相比,不在 Paging 3 库中的背景线程上运行在 Paging 2 的库中。
期待 (基于 Paging Codelab 样本)

  • GithubPagingSource override suspend fun load(...)在 IO 线程上运行。
  • 搜索存储库 Activity viewModel.searchRepo(query).collectLatest { ... }在主线程上运行。

  • 关注
  • GithubPagingSource override suspend fun load(...)和 SearchRepositoriesActivity viewModel.searchRepo(query).collectLatest { ... }在主线程上运行。

  • 分页 2
    线程由 PagedList 在后台处理与 toLiveData根据 documentation .

    If you use LivePagedListBuilder to get a LiveData, it will initialize PagedLists on a background thread for you.


    第 3 页
    寻呼 3 documentation没有提到如何管理线程。但是,从日志中, PagingSource似乎正在主线程上运行网络请求并返回 PagingData在主线程上。
    我的示例代码
    我在 CryptoTweets 中重新创建了 Codelab 模式。示例应用 app-simple 模块。
    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)

    最佳答案

    它没有在 Paging 3 的后台线程上运行,即使我使用 lifecycleScope.launch(Dispatchers.IO)在 View 模型中,当适配器加载时,从主线程访问 PagingSource。所以对于 Room,我通过将 PagingSource 数据库代码包装在 withContext(Dispatchers.IO) { 中来使其工作。

    private const val STARTING_PAGE_INDEX = 0
    private const val COUNT_PER_PAGE = 20

    class LocalImagesPagingSource() : PagingSource<Int, GalleryImage>() {

    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, GalleryImage> {
    val page = params.key ?: STARTING_PAGE_INDEX
    return try {
    withContext(Dispatchers.IO) {
    val dao = GalleryImageDatabase.getDatabase(context).galleryImageDao()
    val images = dao.getGalleryImagesByPosition(page * COUNT_PER_PAGE)

    LoadResult.Page(
    data = images,
    prevKey = if (page == STARTING_PAGE_INDEX) null else page - 1,
    nextKey = if (images.size == 0) null else page + 1
    )
    }
    } catch (exception: IOException) {
    return LoadResult.Error(exception)
    }
    }
    }

    关于android - PagingData 在 Paging 3 库中是否默认在后台线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63985284/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com