如何将我的 Retrofit 响应替换为 RxJava Observe

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

    }

这里是它的实现

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

}

正在使用数据服务

public interface GetNoticeDataService {


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

}

这里是 RxJava 的 CallAdapterFactory 的 Rerofit base

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

我是否应该将我的数据服务更改为

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