[英]RxJava Observer incompatible types
我正在嘗試使用Retrofit和RxJava在我正在處理的應用程序中的自定義視圖中進行API調用,但在嘗試從我的Retrofit API調用中訂閱Observable時遇到了不兼容的類型錯誤。
我的改造界面:
public interface ApiQueryInterface{
// Request method and URL specified in the annotation
// Callback for the parsed response is the last parameter
@GET("users/")
Observable<Users> getUsers (
@Query("key") String key,
@Query("address") String address
);
@GET("posts/")
Observable<Posts> getPosts (
@Query("key") String key,
@Query("address") String address
);
}
以及位於自定義視圖的onFinishInflate()內的Retrofit調用:
// Create RxJava adapter for synchronous call
RxJava2CallAdapterFactory rxAdapter = RxJava2CallAdapterFactory.create();
// Create Retrofit2 instance for API call
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(rxAdapter)
.build();
// Make API call using retrofit
final ApiQueryInterface apiQueryInterface = retrofit.create(ApiQueryInterface.class);
// API return type defined by interface
Observable<Users> query = apiQueryInterface
.getUsers(KEY, ADDRESS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Users>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Users users) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
當我構建項目時,我在以Observable <Users> query = ...開頭的行上的自定義視圖中遇到了一個不兼容的類型錯誤:
錯誤:(60,27)錯誤:不兼容的類型:void無法轉換為Observable <Users>
“Users”是一個通用模型類,它匹配從API返回的JSON對象
RxJava 1
返回一個Subscription
對象而不是Observable
。 RxJava 2
訂閱返回void。 這就是為什么你得到Error:(60, 27) error: incompatible types
。 您將在回調onSubscribe
中獲得Disposable。 如果需要對它的引用,可以在調用回調時將其分配給類級別成員
將返回的對象更改為Subscription
private Subscription subscription;
....
subscription = ApiClient.getInstance()
.getUsers(KEY, ADDRESS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Users>>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(List<Users> users) {
}
});
apiclient
public class ApiClient {
private static ApiClient instance;
private ApiQueryInterface apiqueryinterface;
private ApiClient() {
final Gson gson =
new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
final Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
apiqueryinterface = retrofit.create(ApiQueryInterface.class);
}
public static ApiClient getInstance() {
if (instance == null) {
instance = new ApiClient();
}
return instance;
}
public Observable<List<Users>> getUsers(@NonNull String key, @NonNull String address) {
return apiqueryinterface.getUsers(key, address);
}
}
接口
public interface ApiQueryInterface{
// Request method and URL specified in the annotation
// Callback for the parsed response is the last parameter
@GET("users")
Observable<<List<Users>> getUsers (
@Query("key") String key,
@Query("address") String address
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.