Rx-Java Retrofit没有得到任何响应

时间:2017-08-10 13:49:06

标签: android retrofit2 rx-android rx-java2

我正在尝试做一个示例Rxjava-Retrofit应用程序。我有一个API,用于从OpenWeatherMap

获取用户输入位置的天气信息

我的改造Api界面看起来像这样

public interface ApiInterface {
   @GET("data/2.5/weather?appid=11111111111")
   Observable<WeatherData> getWeather(@Query("q") String place);
 }

用户必须在编辑文本中输入地名,根据输入的地名我将调用API。这是我的整个代码

BehaviorSubject<String> mStringSubject = BehaviorSubject.create();

当用户输入内容时

@Override
public boolean onQueryTextChange(String newText) {
    mStringSubject.onNext(newText);
    return true;
}

然后

 mStringSubject
            .debounce(500, TimeUnit.MILLISECONDS)
            .doOnNext(s -> Log.d(TAG, s))
            .flatMap(s -> mApiInterface.getWeather(s))
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .onErrorReturn(throwable -> null)
            .subscribe(new Observer<WeatherData>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    Log.d(TAG, "onSubscribe: ");
                }

                @Override
                public void onNext(@NonNull WeatherData weatherData) {
                    Log.d(TAG, "onNext: " + weatherData);
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.d(TAG, "onError: " + e.getMessage());
                }

                @Override
                public void onComplete() {
                    Log.d(TAG, "onComplete: ");
                }
            });

这段代码有什么问题吗?由于某种原因,它没有在日志中显示任何内容。难道我做错了什么?

注意:我做的时候

 mStringSubject
            .debounce(500, TimeUnit.MILLISECONDS)
            .subscribe(s -> Log.d(TAG, s));

正确打印用户输入值。

1 个答案:

答案 0 :(得分:0)

试试这个

首先移出主线程并在IO线程上进行服务调用。

mStringSubject
            .debounce(500, TimeUnit.MILLISECONDS)
            .subscribeOn(Schedulers.computation()))
            .doOnNext(s -> Log.d(TAG, s))
            .flatMap(s -> mApiInterface.getWeather(s))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())