Я реализовал библиотеку подкачки, и она работает не совсем так, как должна. Я запрашиваю данные из github и разбиваю список репозиториев по страницам. Код работает хорошо, но после нескольких изменений поискового запроса перестает загружать данные. При отладке данные всегда загружаются хорошо. Думаю, проблема в асинхронности, но не могу понять, где искать.
Мой код:
RepoDataSource
public class RepoDataSource extends PageKeyedDataSource {
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {
Timber.d("Initial RepoDataSource");
try {
Response response = githubService.searchRepos(query, firstNumberPage).execute();
RepoSearchResponse repoSearchResponse = response.body();
if (repoSearchResponse != null) {
List items = repoSearchResponse.getItems();
callback.onResult(items, 1, 2);
}
} catch (IOException e) {
Timber.i(e);
}
}
@Override
public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) {
}
@Override
public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) {
Timber.d("Fetching next page: %s", params.key);
try {
Response response = githubService.searchRepos(query, params.key).execute();
if (response.isSuccessful()) {
RepoSearchResponse repoSearchResponse = response.body();
if (repoSearchResponse != null) {
List items = repoSearchResponse.getItems();
callback.onResult(items, params.key + 1);
}
}
} catch (IOException e) {
Timber.i(e);
}
}
}
GithubApiCall
@GET("search/repositories")
Call searchRepos(@Query("q") String query, @Query("page") Integer page);
RepoDataSourceFactory
public class RepoDataSourceFactory extends DataSource.Factory {
private GithubService githubService;
private String query;
public RepoDataSourceFactory(GithubService githubService, String query) {
this.githubService = githubService;
this.query = query;
}
@NonNull
@Override
public DataSource create() {
return new RepoDataSource(githubService, query);
}
}
Метод репозитория
public class RepoRepository {
...
...
public RepoDataSourceFactory getRepoPagedFactory(String query) {
return new RepoDataSourceFactory(githubService, query);
}
}
Модель просмотра
public final class MyViewModel {
...
public MutableLiveData searchQuery = new MutableLiveData();
...
public LiveData
> getRepos() {
return Transformations.switchMap(searchQuery, query -> {
RepoDataSourceFactory factory = repository.getRepoPagedFactory(query);
return new LivePagedListBuilder(factory, pagedListConfig).build();
});
}
...
public SearchView.OnQueryTextListener listener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query != null && !query.trim().equals("")) {
searchQuery.postValue(query);
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
};
...
}
И в моей деятельности
viewModel.getRepos().observe(this, adapter::submitList);
Подробнее здесь: https://stackoverflow.com/questions/601 ... eral-calls
Почему библиотека подкачки перестает загружать данные после нескольких вызовов? ⇐ Android
Форум для тех, кто программирует под Android
1727259017
Anonymous
Я реализовал библиотеку подкачки, и она работает не совсем так, как должна. Я запрашиваю данные из github и разбиваю список репозиториев по страницам. Код работает хорошо, но после нескольких изменений поискового запроса перестает загружать данные. При отладке данные всегда загружаются хорошо. Думаю, проблема в асинхронности, но не могу понять, где искать.
Мой код:
RepoDataSource
public class RepoDataSource extends PageKeyedDataSource {
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {
Timber.d("Initial RepoDataSource");
try {
Response response = githubService.searchRepos(query, firstNumberPage).execute();
RepoSearchResponse repoSearchResponse = response.body();
if (repoSearchResponse != null) {
List items = repoSearchResponse.getItems();
callback.onResult(items, 1, 2);
}
} catch (IOException e) {
Timber.i(e);
}
}
@Override
public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) {
}
@Override
public void loadAfter(@NonNull LoadParams params, @NonNull LoadCallback callback) {
Timber.d("Fetching next page: %s", params.key);
try {
Response response = githubService.searchRepos(query, params.key).execute();
if (response.isSuccessful()) {
RepoSearchResponse repoSearchResponse = response.body();
if (repoSearchResponse != null) {
List items = repoSearchResponse.getItems();
callback.onResult(items, params.key + 1);
}
}
} catch (IOException e) {
Timber.i(e);
}
}
}
GithubApiCall
@GET("search/repositories")
Call searchRepos(@Query("q") String query, @Query("page") Integer page);
RepoDataSourceFactory
public class RepoDataSourceFactory extends DataSource.Factory {
private GithubService githubService;
private String query;
public RepoDataSourceFactory(GithubService githubService, String query) {
this.githubService = githubService;
this.query = query;
}
@NonNull
@Override
public DataSource create() {
return new RepoDataSource(githubService, query);
}
}
Метод репозитория
public class RepoRepository {
...
...
public RepoDataSourceFactory getRepoPagedFactory(String query) {
return new RepoDataSourceFactory(githubService, query);
}
}
Модель просмотра
public final class MyViewModel {
...
public MutableLiveData searchQuery = new MutableLiveData();
...
public LiveData
> getRepos() {
return Transformations.switchMap(searchQuery, query -> {
RepoDataSourceFactory factory = repository.getRepoPagedFactory(query);
return new LivePagedListBuilder(factory, pagedListConfig).build();
});
}
...
public SearchView.OnQueryTextListener listener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query != null && !query.trim().equals("")) {
searchQuery.postValue(query);
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
};
...
}
И в моей деятельности
viewModel.getRepos().observe(this, adapter::submitList);
Подробнее здесь: [url]https://stackoverflow.com/questions/60136436/why-does-the-paging-library-stop-loading-data-after-several-calls[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия