android - Rx Android - 等待服务器响应

标签 android retrofit rx-java rx-android

我在 Android 应用程序中使用 RxJava 和 Retrofit 从服务器获取数据。我有此代码的测试 Activity 。

    String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewMenu = (LinearLayout) findViewById(R.id.view_menu);
        tabMenu.initTabBar(viewMenu, this);
        CapabilitiesHolder.createIfNotExist().getCapabilities().subscribe(this::handleResponse, RestErrorHandler::handle);
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }



    private void handleResponse(CapabilitiesResponse capabilitiesResponse) {
        if (capabilitiesResponse.isSuccess()) {
            text = capabilitiesResponse.getSupportedCurrencies().get(0).getDescription();
        } else {
            RestErrorHandler.handle(null, capabilitiesResponse);
        }
    }

还有一个单例类,用于在应用程序的整个生命周期中包含来自服务器的数据。

public class CapabilitiesHolder {


    private static CapabilitiesHolder mInstance = null;

    private CapabilitiesResponse capabilities;


    public static CapabilitiesHolder createIfNotExist() {
        if (mInstance == null) {
            mInstance = new CapabilitiesHolder();
        }
        return mInstance;
    }

    private CapabilitiesHolder() {
        requestCapabilities();
    }

    public Observable<CapabilitiesResponse> getCapabilities() {
        return Observable.fromCallable(() -> capabilities);
    }

    private CompositeSubscription compositeSubscription = new CompositeSubscription();

    private void requestCapabilities() {
        Observable<CapabilitiesResponse> o = RestServiceFactory.get().getServerCapabilities();
        compositeSubscription.add(o.subscribe(this::handleResponse, RestErrorHandler::handle));
    }

    private void handleResponse(CapabilitiesResponse capabilitiesResponse) {
        if (capabilitiesResponse.isSuccess()) {
            capabilities = capabilitiesResponse;
        } else {
            RestErrorHandler.handle(null, capabilitiesResponse);
        }
    }

    public void update() {
        mInstance = null;
        mInstance = new CapabilitiesHolder();
    }
}

因此,当我第一次创建测试 Activity 并立即调用 CapabilitiesHolder.createIfNotExist().getCapabilities() 时,tost 是空的,因为响应中的数据需要一些时间才能加载。当稍后调用 onCreate 时,一切正常。

问题是,我如何让(使用 RxJava?)getCapabilities() 方法在被调用之前等待来自服务器的响应。

提前致谢!

最佳答案

简短回答 - 不要阻塞 UI 线程并等待任何事情。

将 Toast 移到处理响应的方法中

 private void handleResponse(CapabilitiesResponse capabilitiesResponse) {
    if (capabilitiesResponse.isSuccess()) {
        text = capabilitiesResponse.getSupportedCurrencies().get(0).getDescription();
        // Toast here 
    } else {
        RestErrorHandler.handle(null, capabilitiesResponse);
    }

关于android - Rx Android - 等待服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161735/

相关文章:

android - 改造未正确接收响应

android - 如何确定给定请求是否正在运行?

android - 使用 Retrofit 在 Android 中重新创建 flask api 调用

kotlin - 在多次更新对象时,仅更新最后一个对象。我希望执行所有更新操作

scala - Scala 中的响应式(Reactive)扩展 (Rx) - 在给定时间间隔后执行方法

java - 无法在 Android 10 中创建目录

java - 使用 TabHost 如何更改文本颜色?

javascript - 创建多语言网站

rest - Kotlin 和改造 : Simple POST without Response

android - 使用 RxAndroid 调度