![](/img/trans.png)
[英]Retrofit response from view-model to observe in fragment using RxJava
[英]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.