Управляется ли фоновый поток автоматически с помощью PagingData
, как и с PagedList
, а затем возвращается в основной поток?
Из приведенных ниже журналов видно, что PagingData
не запускается в фоновом потоке в библиотеке пейджинга 3 по сравнению с PagedList
в библиотеке пейджинга 2.
Ожидать (На основе примера Paging Codelab)
- GithubPagingSource
override suspend fun load(...)
для запуска в потоке ввода-вывода. - SearchRepositoriesActivity
viewModel.searchRepo(query).collectLatest { ... }
для запуска в основном потоке.
Наблюдать
- И GithubPagingSource
override suspend fun load(...)
, и SearchRepositoriesActivityviewModel.searchRepo(query).collectLatest { ... }
выполняются в основном потоке.
Пейджинг 2
Потоки обрабатываются в фоновом режиме PagedList
с toLiveData
в соответствии с документацией.
Если вы используете LivePagedListBuilder для получения LiveData, он инициализирует PagedLists в фоновом потоке.
Страница 3
В документации по пейджингу 3 не упоминается, как осуществляется управление потоками. Однако, судя по журналам, PagingSource
выполняет сетевой запрос в основном потоке и возвращает PagingData
в основном потоке.
Мой пример кода
Я воссоздал шаблон Codelab в модуле CryptoTweets примера приложения 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)
.launchIn(viewModelScope + Dispatchers.IO)
- person IR42   schedule 21.09.2020DefaultDispatcher-worker-1
, аPagingSource
все еще выполняется вmain
в приведенном выше коде. - person Adam Hurwitz   schedule 21.09.2020