我正在尝试使用Retrofit和RxJava在我正在处理的应用程序中的自定义视图中进行API调用,但是在尝试从我的Retrofit API调用中订阅Observable时遇到了不兼容的类型错误。 / p>
我的改造界面:
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&lt; Users&gt;开头的行上的自定义视图中遇到了不兼容的类型错误。 query = ...:
错误:(60,27)错误:不兼容的类型:void无法转换为Observable&lt; Users&gt;
&#34;用户&#34;是一个通用模型类,它匹配从API返回的JSON对象
答案 0 :(得分:2)
Subscription
会返回Observable
个对象而不是RxJava 2
。 Error:(60, 27) error: incompatible types
订阅返回void。这就是你获得onSubscribe
的原因。您在回调{{1}}中获得了Disposable。如果需要对它的引用,可以在调用回调时将其分配给类级别成员
答案 1 :(得分:0)
将返回的对象更改为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
);