簡體   English   中英

如何替換我對 RxJava 的 Retrofit 響應觀察

[英]How to replace my Retrofit response to RxJava Observe

在我的 MVP 架構中,我有一些交互器

interface GetNoticeIntractor {

        interface OnFinishedListener {
            void onFinished(ArrayList<Notice> noticeArrayList, Main main, Wind wind);
            void onFailure(Throwable t);
        }
        void getNoticeArrayList(OnFinishedListener onFinishedListener);

    }

這里它的Impl

public class GetNoticeIntractorImpl implements MainContract.GetNoticeIntractor {
    public LatLng getloc(){
        return currentLocation;
    }
    @Override
    public void getNoticeArrayList(final OnFinishedListener onFinishedListener) {


        /** Create handle for the RetrofitInstance interface*/
        GetNoticeDataService service = RetrofitInstance.getRetrofitInstance().create(GetNoticeDataService.class);

        /** Call the method with parameter in the interface to get the notice data*/
        if(currentLocation!=null) {
            Call<NoticeList> call = service.getNoticeData(currentLocation.latitude, currentLocation.longitude);

            /**Log the URL called*/
            Log.wtf("URL Called", call.request().url() + "");

            call.enqueue(new Callback<NoticeList>() {
                @Override
                public void onResponse(Call<NoticeList> call, Response<NoticeList> response) {
                    onFinishedListener.onFinished(response.body().getNoticeArrayList(), response.body().getMain(), response.body().getWind());

                }

                @Override
                public void onFailure(Call<NoticeList> call, Throwable t) {
                    onFinishedListener.onFailure(t);
                }
            });
        }
    }

}

哪個正在使用 DataService

public interface GetNoticeDataService {


    @GET("weather?appid=0194877ecdcac230396a119c01d46100")
    Call<NoticeList> getNoticeData(@Query("lat") double lat , @Query("lon") double lon );

}

這是帶有 RxJava 的 CallAdapterFactory 的 Rerofit 基礎

public class RetrofitInstance {
    private static Retrofit retrofit;
    private static final String BASE_URL = "http://api.openweathermap.org/data/2.5/";

    /**
     * Create an instance of Retrofit object
     * */
    public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

問題是如何根據rxjava subscripton觀察我的GetNoticeIntractorImpl

我應該將我的 DataService 更改為

@GET("weather?appid=0194877ecdcac230396a119c01d46100")
    Observable<NoticeList> getNoticeData(@Query("lat") double lat , @Query("lon") double lon );

或者只在我的 IntractorImpl 中使用 Observable

Observable.create(e -> {
            Call<NoticeList> call = service.getNoticeData(currentLocation.latitude, currentLocation.longitude);

            /**Log the URL called*/
            Log.wtf("URL Called", call.request().url() + "");

            call.enqueue(new Callback<NoticeList>() {
                @Override
                public void onResponse(Call<NoticeList> call, Response<NoticeList> response) {
                    onFinishedListener.onFinished(response.body().getNoticeArrayList(), response.body().getMain(), response.body().getWind());

                }

                @Override
                public void onFailure(Call<NoticeList> call, Throwable t) {
                    onFinishedListener.onFailure(t);
                }
            });

我需要建議以哪種方式實現它,我會很高興得到任何幫助

我建議您為 rxJava2 使用官方改造適配器

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0 

然后在創建改造對象時添加 rxjava 適配器,如下所示

retrofit2.Retrofit.Builder
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

最后你的 API 接口應該看起來像

@GET("weather?appid=0194877ecdcac230396a119c01d46100")
Observable<NoticeList> getNoticeData(@Query("lat") double lat , @Query("lon") double lon );

調用它的方式可能是這樣的

endpoints.getNoticeData(lat,long).subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread()).
  .subscribe(new Consumer<List<NoticeList>>() {
     @Override
     public void accept(@io.reactivex.annotations.NonNull final List<NoticeList> items)
      {
        //Use your response here
      }
    })
  ); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM