2016-12-22 61 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本身的工作線程工作嗎? 我是否應該一起使用rxJavaretrofit或僅爲retrofit適合我?

+0

我認爲一起使用這3個是非常有效的,從我的經驗很好。如果我們將RX與Retrofit一起使用,則Api集成更有效。 – Nivedh

回答

1

是的,你可以。在清單

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' 
    ... 
} 

權限:

你應該在你的gradle產出添加此依賴

<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); 
} 

終於使API調用:

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和翻新。

如果您在理解或設置問題時遇到問題,請告訴我。

不斷學習

0

如果你有簡單的REST服務調用,無需轉換,然後用剛改造就足夠了。您可以在後臺線程上運行retrofit服務調用,並使用主線程上的響應更新UI。但問題是你需要注意防止內存泄漏。您需要確保在活動被銷燬時所有對象都被銷燬,以防止內存泄漏。

但是對於特定的工作流程,如果您需要進行多個服務調用或過濾或轉換響應,那麼Retrofit和RxJava2將是正確的選擇。 RxJava使用CompositeDisposable可以防止內存泄漏。

如果您想構建反應型應用程序,無論其他服務調用的複雜性如何,請參閱RxJava2。

相關問題