Вы можете использовать комбинацию RxJava и Retrofit для этой цели.
Вот как вы можете это сделать. Я буду использовать GitHub API для примера.
Создайте интерфейс Java для вашего HTTP API.
public interface GitHubService {
@GET("users/{user}/repos")
Observable<List<Repo>> listRepos(@Path("user") String user);
}
Использование Observable преобразует ответ в поток. Каждое событие - это список репо.
Используйте класс Retrofit для генерации реализации интерфейса GitHubService. Вы можете предоставлять или не предоставлять пользовательский HTTP-клиент.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.client(okHttpClient) // OkHttp Client
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
GitHubService service = retrofit.create(GitHubService.class);
Теперь идет часть Rx. Вы должны добавить подписчика для прослушивания ответов, отправленных обратно сервером. Другими словами, реагирует на него.
service.listRepos("octocat")
.subscribeOn(Schedulers.io()) // 1
.observeOn(AndroidSchedulers.mainThread()) // 2
.flatMap(Observable::from) // 3
.subscribe(repoList -> { // 4
// Update the list view
// notifyDataSetChanged
});
Вот что делают строки, прокомментированные числами -
1 - сообщает операционной системе, какой поток будет использоваться для вызова. Для этого мы выбираем поток ввода-вывода.
2 - Сообщает ОС, какой поток будет использоваться для прослушивания ответа. Мы делаем это в основном потоке и обновляем пользовательский интерфейс при получении ответа.
3 - Эта линия демонстрирует истинную магию Rx. Эта простая маленькая строка преобразует список ответов в отдельные объекты. Следовательно, мы будем реагировать на каждый объект, а не на весь список. Подробнее об этом можно прочитать здесь .
4 - Эта строка фактически определяет, какая «реакция» будет показана на событие. Вы можете обновить адаптер здесь.
Более сложный подписчик выглядит так -
new Subscriber<Repo>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Repo repo) {
}
}
P.S. - Я использовал лямбды в приведенных выше примерах. Вы можете добавить это через здесь .