【发布时间】:2020-06-16 06:08:11
【问题描述】:
我已经使用一周前发布的新 Paging 3 库的 codelabs 教程实现了应用程序。 问题是应用程序无法在离线模式下工作。它不会从 Room 数据库中检索数据。
教程回购链接:- https://github.com/googlecodelabs/android-paging
代码:-
-
RepoDao.kt
@Dao interface RepoDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertAll(repos: List<Repo>) @Query("SELECT * FROM repos WHERE " + "name LIKE :queryString OR description LIKE :queryString " + "ORDER BY stars DESC, name ASC") fun reposByName(queryString: String): PagingSource<Int, Repo> @Query("DELETE FROM repos") suspend fun clearRepos() } -
GithubRepository.kt
class GithubRepository( private val service: GithubService, private val database: RepoDatabase ) { fun getSearchResultStream(query: String): Flow<PagingData<Repo>> { val dbQuery = "%${query.replace(' ', '%')}%" val pagingSourceFactory = { database.reposDao().reposByName(dbQuery) } return Pager( config = PagingConfig(pageSize = NETWORK_PAGE_SIZE), remoteMediator = GithubRemoteMediator( query, service, database ), pagingSourceFactory = pagingSourceFactory ).flow } companion object { private const val NETWORK_PAGE_SIZE = 50 } } -
SearchRepositoriesViewModel.kt
@ExperimentalCoroutinesApi class SearchRepositoriesViewModel(private val repository: GithubRepository) : ViewModel() { private var currentQueryValue: String? = null private var currentSearchResult: Flow<PagingData<Repo>>? = null fun searchRepo(queryString: String): Flow<PagingData<Repo>> { val lastResult = currentSearchResult if (queryString == currentQueryValue && lastResult != null) { return lastResult } currentQueryValue = queryString val newResult: Flow<PagingData<Repo>> = repository.getSearchResultStream(queryString).cachedIn(viewModelScope) currentSearchResult = newResult return newResult } } -
SearchRepositoriesActivity.kt
@ExperimentalCoroutinesApi class SearchRepositoriesActivity : AppCompatActivity() { ..... private lateinit var viewModel: SearchRepositoriesViewModel private val adapter = ReposAdapter() private var searchJob: Job? = null // this is where adapter get flow data from viewModel // initially this is called with **Android** as a query private fun search(query: String) { searchJob?.cancel() searchJob = lifecycleScope.launch { viewModel.searchRepo(query).collectLatest { adapter.submitData(it) } } } ..... }
输出:- 当应用程序在离线模式下打开时,它只是显示空的回收器视图。
【问题讨论】:
标签: android kotlin android-room android-architecture-components android-paging