如何将我的 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
}
})
);
在我的 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
}
})
);