2016-12-22 3 views
0

я использовал:Можем ли мы использовать Retrofit, RxJava, RxAndroid вместе?

compile 'com.squareup.retrofit2:retrofit:2.1.0' 
compile 'io.reactivex:rxandroid:1.2.1' 
compile 'com.squareup.retrofit2:retrofit 
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 

Должен ли я использовать как этот путь, я читал retrofit 1.x сам работать на рабочем потоке? Должен ли я использовать rxJava и retrofit вместе или только retrofit Работайте для меня?

+0

Я думаю, что использование этого 3 вместе является очень эффективным и хорошим из моего опыта. Интеграция Api более эффективна, если мы вместе используем Retrofit вместе с RX. – Nivedh

ответ

1

Да, вы можете.

Вы должны добавить эту зависимость в вашем Gradle:

dependencies { 
    ... 
    compile 'com.squareup.retrofit2:retrofit:2.1.0' 
    compile 'com.squareup.retrofit2:converter-gson:2.1.0' 
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' 
    compile 'com.squareup.okhttp3:okhttp:3.4.1' 
    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
    compile 'io.reactivex:rxandroid:1.2.1' 
    compile 'io.reactivex:rxjava:1.2.1' 
    ... 
} 

Разрешения в манифесте:

<uses-permission android:name="android.permission.INTERNET" /> 

Создатель сервиса может быть как это:

public class RxServiceCreator { 

    private OkHttpClient.Builder httpClient; 
    private static final int DEFAULT_TIMEOUT = 30; //seconds 

    private Gson gson; 
    private RxJavaCallAdapterFactory rxAdapter; 
    private Retrofit.Builder builder; 

    private static RxServiceCreator mInstance = null; 

    private RxServiceCreator() { 
     httpClient = new OkHttpClient.Builder(); 
     gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); 
     rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()); 
     builder = new Retrofit.Builder() 
       .baseUrl("yourbaseurl") 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .addCallAdapterFactory(rxAdapter); 

     if (BuildConfig.REST_DEBUG) { 
      HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
      logging.setLevel(HttpLoggingInterceptor.Level.BODY); 
      httpClient.addInterceptor(logging); 
     } 

     httpClient.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); 
     httpClient.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); 
     httpClient.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); 
    } 

    public static RxServiceCreator getInstance() { 
     if (mInstance == null) { 
      mInstance = new RxServiceCreator(); 
     } 
     return mInstance; 
    } 

    public <RESTService> RESTService createService(Class<RESTService> service) { 
     Retrofit retrofit = builder.client(httpClient.build()).build(); 
     return retrofit.create(service); 
    } 
} 

Вы интерфейс может быть некоторые такие:

public interface UserAPI { 

    @GET("user/get_by_email") 
    Observable<Response<UserResponse>> getUserByEmail(@Query("email") String email); 
} 

И, наконец, чтобы сделать апи вызов:

UserAPI userApi = RxServiceCreator.getInstance().createService(UserAPI.class); 

userApi.getUserByEmail("[email protected]") 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(userResponse -> { 
          if (userResponse.isSuccessful()) { 
           Log.i(TAG, userResponse.toString()); 
          } else { 
           Log.i(TAG, "Response Error!!!"); 
          } 
         }, 
         throwable -> { 
          Log.e(TAG, throwable.getMessage(), throwable); 
         }); 
0

Да, вы можете.

Вот link для минимального образца кода для интеграции Rxjava с модификацией.

Сообщите мне, если у вас возникли проблемы с пониманием проблемы или ее настройкой.

Keep Учимся

0

Если у вас есть простой вызов остальные службы и не требуется преобразование, то, используя только Дооснащение будет достаточно. Вы можете запускать сервисные вызовы в фоновом потоке и обновлять интерфейс с ответом на основной поток. Но проблема в том, что вам нужно позаботиться о предотвращении утечек памяти. Вы должны убедиться, что все объекты уничтожены, когда активность уничтожена, чтобы предотвратить утечку памяти.

Но для конкретного рабочего потока, если вам нужно сделать несколько вызовов обслуживания или фильтровать или преобразовать ответы, то опция «Дооснащение» и RxJava2 будут правильной. И предотвращение утечек памяти легко с помощью RxJava с помощью CompositeDisposable.

Если вы хотите создать реактивные приложения, независимо от сложности вызовов службы отдыха, перейдите на RxJava2.

Смежные вопросы