RxJava Observer不兼容的类型

时间:2017-04-15 16:35:28

标签: java android rx-java retrofit2 rx-android

我正在尝试使用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对象

2 个答案:

答案 0 :(得分:2)

Subscription会返回Observable个对象而不是RxJava 2Error:(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
);