2016-09-06 8 views
0

Я знаю, что RxJava созданы, чтобы сделать код похожим на stream.However, в моих кодах, на самом деле мне приходится часто делать HTTP-запросы, и я считаю его менее изящным каждый раз, когда я использую RxJava + Retrofit, чтобы сделать сетевое задание, потому что я приходится писать одни и те же коды много раз. Поэтому я Enclosure коды, как показано нижеКак использовать RxJava + Retrofit лучше?

public APIHelper(String url){ 
    retrofit = new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .baseUrl(url) 
      .client(setheader()) 
      .build(); 
} 

private static OkHttpClient setheader() { 

    OkHttpClient httpClient = new OkHttpClient.Builder() 
      .addInterceptor(new Interceptor() { 
       @Override 
       public Response intercept(Chain chain) throws IOException { 
        Request request = chain.request() 
          .newBuilder() 
          .addHeader("UserID", "") 
          .addHeader("hec-username", USERNAME) 
          .addHeader(AUTHENTICATION_KEY, TOKEN) 
          .build(); 
        return chain.proceed(request); 
       } 
      }).build(); 
    return httpClient; 
} 

public Retrofit getRetrofit(){ 
    if(retrofit!=null) 
     return retrofit; 
    else 
     return null; 
} 

public void excuteRxJava(Observable<T> observable){ 
       observable 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<T>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 

        } 

        @Override 
        public void onNext(T t) { 
         doNext(t); 
        } 
       }); 
} 

public abstract void doNext(T t); 

public abstract List<S> doInFrom(T t); 

public abstract void doAction(T t); 

Некоторые другие абстрактные методы используются, чтобы сделать что-то в onDoNext, flatMap например, И я хочу спросить, является ли это инкапсуляция подходящей для концепции Rx?

ответ

-1

сделать какой-нибудь utils класс.

public class RetrofitUtils { 
public static final String Tag = RetrofitUtils.class.getSimpleName(); 
public static <T> T getInstance(final Class<T> service) 
{ 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(Constant.SERVER_URL)//做成静态变量 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .build(); 
    T t = retrofit.create(service); 
    return t; 
} 

} Результат

   final UserInterface instance = RetrofitUtils.getInstance(UserInterface.class); 
       Observable<JsonElement> register = instance.resetPassword(Des3.encodeAndUrl(etUsername.getText().toString().trim()), Des3.encodeAndUrl(etPassword.getText().toString().trim()), etVcode.getText().toString().trim()); 
       RetrofitFlow.getData(register).subscribe(new DefaultSubscriber<JsonElement>() { 
        @Override 
        public void onNext(JsonElement jsonElement) { 
         LogUtil.i(jsonElement.toString()); 
         RxBus.getDefault().post(new LoginJumpBean(null, LoginJumpBean.AIM_FINISH_ACTIVITY)); 
        } 
       }); 

public abstract class DefaultSubscriber<T> extends Subscriber<T> { 
    public static final String Tag = DefaultSubscriber.class.getSimpleName(); 

    @Override 
    public void onCompleted() { 
     LogUtil.i("完成"); 
    } 

    @Override 
    public void onError(Throwable e) { 
     LogUtil.i("发生错误:"+e.getMessage()); 
    } 


} 

использование rxjava фильтр.

+0

спасибо, и я научусь код –

+0

е ,,, я новичок – WangDaFu

+0

握 爪 ..... ......... –

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