2016-11-06 10 views
0

Мой код: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(); 
      } 
     } 

build.gradle:

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

ответ

1

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

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

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

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

+0

Я использую RxJava 2, и когда я пытаюсь написать RxJava (CallAdapterFactory), единственный намек, который я получил из Android Studio 2, - это RxThreadFactory, RxAndroidPlugins и RxJavaPlugins, поэтому я полагаю, что у меня нет этого RxJavaCallAdapterFactory , это возможно? – Donovant

+0

Я обновил свой ответ. –

+0

Используя RxJava2CallAdapter, я получаю это: 'com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 404 Not Found' – Donovant

1

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

+0

Моя проблема заключается в том, что я не могу использовать этот синтакс (->/lambda) в Android Studio 2, а также не настраивал какой-либо адаптер в своем пользовательском клиенте. – Donovant