Android
Retrofit2 с RxJava
Поиск…
Retrofit2 с RxJava
Во-первых, добавьте соответствующие зависимости в файл build.gradle.
dependencies {
....
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
....
}
Затем создайте модель, которую хотите получить:
public class Server {
public String name;
public String url;
public String apikey;
public List<Site> siteList;
}
Создайте интерфейс, содержащий методы, используемые для обмена данными с удаленным сервером:
public interface ApiServerRequests {
@GET("api/get-servers")
public Observable<List<Server>> getServers();
}
Затем создайте экземпляр Retrofit
:
public ApiRequests DeviceAPIHelper ()
{
Gson gson = new GsonBuilder().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
api = retrofit.create(ApiServerRequests.class);
return api;
}
Затем, в любом месте от кода, вызовите метод:
apiRequests.getServers()
.subscribeOn(Schedulers.io()) // the observable is emitted on io thread
.observerOn(AndroidSchedulers.mainThread()) // Methods needed to handle request in background thread
.subscribe(new Subscriber<List<Server>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<Server> servers) {
//A list of servers is fetched successfully
}
});
Модернизация с помощью RxJava для получения данных асинхронно
Из репозитория GitHub RxJava RxJava представляет собой реализацию виртуальных расширений Java VM: библиотека для составления асинхронных и основанных на событиях программ с использованием наблюдаемых последовательностей. Он расширяет шаблон наблюдателя для поддержки последовательностей данных / событий и добавляет операторы, которые позволяют скомпоновать последовательности вместе декларативно, в то же время абстрагируя проблемы, связанные с такими проблемами, как низкоуровневая потоковая передача, синхронизация, потоковая безопасность и параллельные структуры данных.
Retrofit - это безопасный для HTTP-клиент HTTP для Android и Java, при этом разработчики могут сделать все сетевые вещи намного проще. В качестве примера мы собираемся загрузить JSON и показать его в RecyclerView в виде списка.
Начиная:
Добавьте зависимости RxJava, RxAndroid и Retrofit на уровне вашего приложения. Build.gradle file: compile "io.reactivex:rxjava:1.1.6"
compile "io.reactivex:rxandroid:1.2.1"
compile "com.squareup.retrofit2:adapter-rxjava:2.0.2"
compile "com.google.code.gson:gson:2.6.2"
compile "com.squareup.retrofit2:retrofit:2.0.2"
compile "com.squareup.retrofit2:converter-gson:2.0.2"
Определить ApiClient и ApiInterface для обмена данными с сервера
public class ApiClient {
private static Retrofit retrofitInstance = null;
private static final String BASE_URL = "https://api.github.com/";
public static Retrofit getInstance() {
if (retrofitInstance == null) {
retrofitInstance = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofitInstance;
}
public static <T> T createRetrofitService(final Class<T> clazz, final String endPoint) {
final Retrofit restAdapter = new Retrofit.Builder()
.baseUrl(endPoint)
.build();
return restAdapter.create(clazz);
}
public static String getBaseUrl() {
return BASE_URL;
}}
открытый интерфейс ApiInterface {
@GET("repos/{org}/{repo}/issues")
Observable<List<Issue>> getIssues(@Path("org") String organisation,
@Path("repo") String repositoryName,
@Query("page") int pageNumber);}
Обратите внимание, что getRepos () возвращает Observable, а не только список проблем.
Определить модели
Пример для этого показан. Вы можете использовать бесплатные услуги, такие как JsonSchema2Pojo или это.
public class Comment {
@SerializedName("url")
@Expose
private String url;
@SerializedName("html_url")
@Expose
private String htmlUrl;
//Getters and Setters
}
Создать экземпляр «Дополнения»
ApiInterface apiService = ApiClient.getInstance().create(ApiInterface.class);
Затем используйте этот экземпляр для извлечения данных с сервера
Observable<List<Issue>> issueObservable = apiService.getIssues(org, repo, pageNumber);
issueObservable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.map(issues -> issues) //get issues and map to issues list
.subscribe(new Subscriber<List<Issue>>() {
@Override
public void onCompleted() {
Log.i(TAG, "onCompleted: COMPLETED!");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: ", e);
}
@Override
public void onNext(List<Issue> issues) {
recyclerView.setAdapter(new IssueAdapter(MainActivity.this, issues, apiService));
}
});
Теперь вы успешно извлекли данные с сервера с помощью Retrofit и RxJava.
Пример вложенных запросов: несколько запросов, объединение результатов
Предположим, у нас есть API, который позволяет нам получать метаданные объекта в одном запросе ( getAllPets
) и другой запрос, который имеет полные данные одного ресурса ( getSinglePet
). Как мы можем запросить их все в одной цепочке?
public class PetsFetcher {
static class PetRepository {
List<Integer> ids;
}
static class Pet {
int id;
String name;
int weight;
int height;
}
interface PetApi {
@GET("pets") Observable<PetRepository> getAllPets();
@GET("pet/{id}") Observable<Pet> getSinglePet(@Path("id") int id);
}
PetApi petApi;
Disposable petsDisposable;
public void requestAllPets() {
petApi.getAllPets()
.doOnSubscribe(new Consumer<Disposable>() {
@Override public void accept(Disposable disposable) throws Exception {
petsDisposable = disposable;
}
})
.flatMap(new Function<PetRepository, ObservableSource<Integer>>() {
@Override
public ObservableSource<Integer> apply(PetRepository petRepository) throws Exception {
List<Integer> petIds = petRepository.ids;
return Observable.fromIterable(petIds);
}
})
.flatMap(new Function<Integer, ObservableSource<Pet>>() {
@Override public ObservableSource<Pet> apply(Integer id) throws Exception {
return petApi.getSinglePet(id);
}
})
.toList()
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<Pet>>() {
@Override public void accept(List<Pet> pets) throws Exception {
//use your pets here
}
}, new Consumer<Throwable>() {
@Override public void accept(Throwable throwable) throws Exception {
//show user something goes wrong
}
});
}
void cancelRequests(){
if (petsDisposable!=null){
petsDisposable.dispose();
petsDisposable = null;
}
}
}