Как исправить бесконечный вызов API даже без прокрутки при использовании удаленного посредника Paging 3 в Jetpack ComposAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить бесконечный вызов API даже без прокрутки при использовании удаленного посредника Paging 3 в Jetpack Compos

Сообщение Anonymous »

Я новичок и только учусь использовать Jetpack Compose. Я обнаружил ошибки, связанные с бесконечным вызовом API на моем удаленном посреднике. Я использую нижнюю панель. Вот мой код:
Вот мой класс удаленного посредника

Код: Выделить всё

@OptIn(ExperimentalPagingApi::class)
class TopAnimeRemoteMediator(
private val apiService: ApiService,
private val database: TopAnimeDatabase,
) : RemoteMediator() {
override suspend fun load(
loadType: LoadType,
state: PagingState
): MediatorResult {
val page = when (loadType) {
LoadType.REFRESH -> 1
LoadType.PREPEND -> return MediatorResult.Success(endOfPaginationReached = true)
LoadType.APPEND -> {
val lastItem = state.lastItemOrNull()
Log.d("RRREMOTE", lastItem?.pagination?.currentPage.toString())
if (lastItem?.pagination?.hasNextPage == false) {
return MediatorResult.Success(endOfPaginationReached = true)
} else {
lastItem?.pagination?.currentPage?.plus(1)
}
}
}

return try {
val response = apiService.getTopAnime("g", page, PAGE_SIZE_CONFIG)
database.withTransaction {
if (loadType == LoadType.REFRESH) {
database.topAnimeDao().deleteTopAnime()
}
database.topAnimeDao().insertTopAnime(listOf(response))
}
MediatorResult.Success(endOfPaginationReached = !response.pagination.hasNextPage)
} catch (e: Exception) {
return MediatorResult.Error(e)
} catch (e: HttpException) {
MediatorResult.Error(e)
}
}

companion object {
const val PAGE_SIZE_CONFIG = 5
}
}
Вот мой репозиторий

Код: Выделить всё

class TopAnimeRepository(private val apiService: ApiService, private val topAnimeDatabase: TopAnimeDatabase) {

@OptIn(ExperimentalPagingApi::class)
fun getTopAnime(): Flow
> {
return Pager(
config = PagingConfig(
pageSize = TopAnimeRemoteMediator.PAGE_SIZE_CONFIG
),
remoteMediator = TopAnimeRemoteMediator(
apiService, topAnimeDatabase
),
pagingSourceFactory = {
topAnimeDatabase.topAnimeDao().getAllTopAnime()
}
).flow
}
}
Вот моя модель представления

Код: Выделить всё

class MainViewModel(database: TopAnimeDatabase) : ViewModel() {

private val apiService: ApiService = ApiConfig.getAnimeApiService()
private val topAnimeRepository = TopAnimeRepository(apiService, database)

val topAnimePager: Flow
> =
topAnimeRepository.getTopAnime().cachedIn(viewModelScope)
}
Вот вид

Код: Выделить всё

@Composable
fun HomeScreenBase(modifier: Modifier = Modifier) {

val context = LocalContext.current
val mainViewModel: MainViewModel = viewModel {
MainViewModel(TopAnimeDatabase.getDatabase(context))
}

val topAnimeList = mainViewModel.topAnimePager.collectAsLazyPagingItems()
val snackBarHostState = remember { SnackbarHostState() }
val errorMessage = stringResource(R.string.failed_to_retrieve_data)

when (topAnimeList.loadState.refresh) {
LoadState.Loading -> {
Box(
modifier = modifier
.fillMaxSize()
.padding(bottom = 16.dp), // Adjust the padding as needed
contentAlignment = Alignment.BottomCenter
) {
CircularProgressIndicator()
}
}

is LoadState.Error -> {
LaunchedEffect(snackBarHostState) {
snackBarHostState.showSnackbar(
message = errorMessage,
duration = SnackbarDuration.Short,
withDismissAction = true,
)
}
Scaffold(snackbarHost = { SnackbarHost(hostState = snackBarHostState) }){ paddingValues -> modifier.padding(paddingValues) }
}

else ->  {
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Adaptive(200.dp),
horizontalArrangement = Arrangement.spacedBy(2.dp),
verticalItemSpacing = 2.dp,
content = {
topAnimeList.itemSnapshotList.items.forEach { topAnime ->
items(topAnime.data.size) { index ->
TopAnimeItem(topAnime.data[index])
}
}
},
modifier = modifier.fillMaxSize()
)
}
}
}
Пример ответа API прикреплен к изображению
Изображение

Я хочу нормального поведения, каким оно должно быть. Когда пользователь прокручивает страницу вниз, он запрашивает данные следующей страницы вместо того, чтобы запрашивать снова и снова в начале, даже если она находится в режиме ожидания.

Подробнее здесь: https://stackoverflow.com/questions/770 ... mote-media
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»