首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android分页RemoteMediator不加载任何数据

Android分页RemoteMediator不加载任何数据
EN

Stack Overflow用户
提问于 2022-04-20 22:19:49
回答 1查看 588关注 0票数 0

我正在尝试为Jetpack撰写应用程序设置分页3,该应用程序可以从Retrofit服务器和Room数据库获得数据。我创建了一个RemoteMediator来加载我想要的数据。我第一次运行这个应用程序时,它就正确地显示了项目列表。但是,任何后续运行都不会显示任何数据,即使数据在服务器上。我想让数据显示在屏幕上。

在检查之后,看起来该数据已从Room数据库中删除,并且不再调用RemoteMediator load方法。因此,在可组合文件中显示的项目计数为0。我不知道是什么阻止了load方法被调用。

RemoteMediator:

代码语言:javascript
运行
复制
@OptIn(ExperimentalPagingApi::class)
class TaskArchiveRemoteMediator(
    private val clock: Clock,
    private val promptDatabase: PromptDatabase,
    private val promptService: PromptService,
) : RemoteMediator<Int, Task>() {
//    override suspend fun initialize(): InitializeAction {
//        val lastRefreshedAt = promptDatabase.taskDao().getLastArchiveRefreshedAt()
//        return if (lastRefreshedAt?.let { isExpired(it, Instant.now(clock)) } == false) {
//            Log.d("TaskArchiveRemoteMediator", "Should not refresh")
//            InitializeAction.SKIP_INITIAL_REFRESH
//        } else {
//            Log.d("TaskArchiveRemoteMediator", "Should refresh")
//            InitializeAction.LAUNCH_INITIAL_REFRESH
//        }
//    }

    override suspend fun load(loadType: LoadType, state: PagingState<Int, Task>): MediatorResult {
        return try {
            Log.d("TaskArchiveRemoteMediator", "loadType $loadType")
            val loadKey = when (loadType) {
                LoadType.REFRESH -> null
                LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true)
                LoadType.APPEND -> {
                    val remoteKey = getRemoteKeyForLastItem(state)
                    remoteKey?.nextPageKey
                        ?: return MediatorResult.Success(endOfPaginationReached = true)
                }
            }
            val limit = if (loadType == LoadType.REFRESH) {
                state.config.initialLoadSize
            } else {
                state.config.pageSize
            }

            val page = getTaskPage(loadKey, limit)
            Log.d("TaskArchiveRemoteMediator", "page: $page")

            promptDatabase.withTransaction {
                if (loadType == LoadType.REFRESH) {
                    promptDatabase.taskDao().deleteArchive()
                    promptDatabase.taskRemoteKeyDao().deleteAll()
                }

                page.tasks.lastOrNull()?.let {
                    promptDatabase.taskRemoteKeyDao().insert(TaskRemoteKey(it.id, page.nextCursor))
                }

                val tasks = page.tasks.map { it.toTask(Instant.now(clock)) }
                Log.d("TaskArchiveRemoteMediator", "tasks: $tasks")
                promptDatabase.taskDao().insertAll(tasks)
            }

            MediatorResult.Success(endOfPaginationReached = page.nextCursor == null)
        } catch (e: TaskArchivePagingException) {
            Log.e("TaskArchiveRemoteMediator", "archive load error", e)
            MediatorResult.Error(e)
        } catch (e: IOException) {
            Log.e("TaskArchiveRemoteMediator", "archive load error", e)
            MediatorResult.Error(e)
        } catch (e: HttpException) {
            Log.e("TaskArchiveRemoteMediator", "archive load error", e)
            MediatorResult.Error(e)
        }
    }

    private suspend fun getRemoteKeyForLastItem(state: PagingState<Int, Task>) =
        state.lastItemOrNull()?.id?.let { promptDatabase.taskRemoteKeyDao().getById(it) }

    private suspend fun getTaskPage(after: String?, size: Int): TaskPage {
        val response = promptService.getArchive(after, size)
        if (!response.isSuccessful) {
            throw TaskArchivePagingException(response.message())
        }

        return response.body() ?: throw TaskArchivePagingException("Server response has empty body")
    }
}

储存库:

代码语言:javascript
运行
复制
class TaskArchiveRepository @Inject constructor(
    private val clock: Clock,
    private val promptDatabase: PromptDatabase,
    private val promptService: PromptService,
) {
    @OptIn(ExperimentalPagingApi::class)
    fun getArchive(pageSize: Int) =
        Pager(
            PagingConfig(pageSize),
            remoteMediator = TaskArchiveRemoteMediator(clock, promptDatabase, promptService),
        ) {
            promptDatabase.taskDao().getArchive()
        }.flow
}

可合成的:

代码语言:javascript
运行
复制
@Composable
fun TaskArchiveScreen(
    setTopBarState: (TopBarState) -> Unit = {},
    navigateToTaskDetails: (String) -> Unit = {},
    taskArchiveViewModel: TaskArchiveViewModel = hiltViewModel(),
) {
    val taskItems = rememberWithLifecycle(taskArchiveViewModel.archive).collectAsLazyPagingItems()
    val hasData = taskItems.loadState.refresh is LoadState.NotLoading && taskItems.itemCount > 0
    Log.d("TaskArchiveScreen", "loadState: ${taskItems.loadState}, itemCount: ${taskItems.itemCount}")
    val overflowActions = if (hasData) {
        val refreshAction = ActionState(
            icon = painterResource(R.drawable.ic_baseline_refresh_24),
            title = stringResource(R.string.refresh_action),
            onClick = taskItems::refresh,
        )
        listOf(refreshAction)
    } else {
        emptyList()
    }
    setTopBarState(
        TopBarState(
            title = stringResource(R.string.task_archive_title),
            navIconType = NavIconType.Menu,
            overflowActions = overflowActions,
        )
    )
    when {
        taskItems.loadState.refresh is LoadState.Loading -> TaskListLoadingContent()
        taskItems.loadState.refresh is LoadState.Error ->
            LoadFailureContent(
                loadFailureMessage = stringResource(R.string.load_task_archive_failure_message),
                reload = taskItems::retry,
            )
        hasData ->
            TaskArchiveDataContent(
                taskItems = taskItems,
                navigateToTaskDetails = navigateToTaskDetails,
            )
        else -> TaskArchiveEmptyContent()
    }
}

我如何让我的传呼项目加载?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-21 21:02:23

原来来自服务器的数据格式错误:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71946790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档