Android RxJava2: как настроить правильный асинхронный наблюдаемый, использующий REST API?

Мой код:

RestClient client = new RestClient();
        Disposable subscribe = client.getApiMovie().getTopRated()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( data -> { Log.d("mytag", data.body().toString()) });

Это правильный код. PS: я использую Android Studio 2, как я могу настроить его для использования лямбда-выражения?

мой конструктор RestClient:

//what adapter shall I use?
    public RestClient(){
            if( client == null ) {
                client = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(getHttpClient())
                        .build();
            }
        }

построить.градле:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.example.username.sunshine.app"
        minSdkVersion 21
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        jackOptions {
            enabled true
        }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Синтаксис Lambda теперь должен работать, если добавить jackOptions и compileOptions.


person Donovant    schedule 06.11.2016    source источник


Ответы (2)


Если вы собираетесь использовать Retrofit с Rx, не забудьте добавить адаптер вызова для Rx.

client = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(getHttpClient())
                    .build();

Если вы поступаете так, вы поступаете правильно. Для лучшего сопоставления остаточный клиент должен вернуть Observable с вашим объектом, например Observable<List<Movie>> getApiMovie();, и это вернет список фильмов. Объект Movie должен содержать все свойства из API, аннотированные @SerializedName("objectName").

Поскольку вы используете RxJava 2, используйте .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) с зависимостью compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'. Подробнее здесь здесь.

person Florescu Cătălin    schedule 07.11.2016
comment
Я использую RxJava 2, и когда я пытаюсь написать RxJava(CallAdapterFactory), единственная подсказка, которую я получил от Android Studio 2, это RxThreadFactory, RxAndroidPlugins и RxJavaPlugins, поэтому я предполагаю, что у меня нет этого RxJavaCallAdapterFactory, это возможно? - person Donovant; 07.11.2016
comment
Используя RxJava2CallAdapter, я получаю следующее: com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 404 Not Found - person Donovant; 13.11.2016
comment
URL не существует. Проверьте свой URL-адрес, если он правильный, или найдите, существует ли он на самом деле. - person Florescu Cătălin; 13.11.2016
comment
Но я не использую это вручную или намеренно, я полагаю, что это используется .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - person Donovant; 13.11.2016
comment
Нет. Этот преобразователь используется для преобразования ответов на модификацию в Observables. Это все еще ваш URL. - person Florescu Cătălin; 13.11.2016
comment
Нашла здесь http://stackoverflow.com/questions/32964656/android-retrofitrxjava-send-post-request-to-local-server-ive-receive-retro - person Donovant; 13.11.2016
comment
Исключение было преобразовано с помощью RxJava2CallAdapterFactory из Retrofit HttpException в Observable, чтобы его можно было передать в реализацию onError(). Это все еще ваша проблема с URL. Во что пишется ваш сервер? Я предполагаю, что это личное. - person Florescu Cătălin; 13.11.2016
comment
Я только изучаю, как создавать приложения для Android с использованием общедоступных API-интерфейсов themoviedb, теперь это исправлено. - person Donovant; 13.11.2016
comment
В чем была проблема? - person Florescu Cătălin; 13.11.2016
comment
Как вы сказали, неправильный URL-адрес в baseUrl APIService @GET("/movie/top_rated") Observable<MovieResults> getTopRated(); Я удалил первую косую черту. - person Donovant; 13.11.2016

Да, верно, ваш API-клиент должен возвращать Observable. Библиотека модернизации может использовать «фабрику адаптеров» для возврата наблюдаемых. Если это ваш собственный RestClient и вы создаете Observable вручную, не забудьте использовать Observable.defer(()- > yourTask). Существует библиотека под названием Retrolambda, она позволяет использовать лямбда-выражения, но я столкнулся с проблемой, что она не работает с последней версией AndroidStudio, и AndroidStudio предлагает вместо этого использовать Jack. Сейчас я использую Retrolambda.

person Alex Shutov    schedule 06.11.2016
comment
Моя проблема в том, что я не могу использовать этот синтаксис (-›/лямбда) в Android Studio 2, а также я не устанавливал адаптер в своем пользовательском клиенте. - person Donovant; 07.11.2016