Rx Android-等待服务器响应

Rx Android-等待服务器响应,android,retrofit,rx-java,rx-android,Android,Retrofit,Rx Java,Rx Android,我在Android应用程序中使用RxJava并进行改装,以从服务器获取数据。我有这个代码的测试活动 String text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewMenu = (LinearLayout) findViewById(R.id.view_menu);

我在Android应用程序中使用RxJava并进行改装,以从服务器获取数据。我有这个代码的测试活动

    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();
    }
}
公共类功能文件夹{
私有静态能力Holder MinInstance=null;
私人能力:反应能力;
公共静态能力文件夹createIfNotExist(){
if(minInstance==null){
MinInstance=新的功能文件夹();
}
回报率;
}
私人能力文件夹(){
请求能力();
}
公共可观测getCapabilities(){
返回Observable.fromCallable(()->能力);
}
私有CompositeSubscription CompositeSubscription=新CompositeSubscription();
私有void requestCapabilities(){
可观察的o=RestServiceFactory.get().getServerCapabilities();
add(o.subscribe(this::handleResponse,RestErrorHandler::handle));
}
私人无效HandlerResponse(CapabilitiesResponse CapabilitiesResponse){
if(能力响应.isSuccess()){
能力=能力响应;
}否则{
句柄(null,capabilitiesResponse);
}
}
公共无效更新(){
mInstance=null;
MinInstance=新的功能文件夹();
}
}
因此,当我的测试活动第一次创建并立即调用
capabilitieshalder.createIfNotExist().getCapabilities()
时,tost是空的,因为响应中的数据需要一些时间才能加载。稍晚一点调用
onCreate
时,一切正常

问题是,在调用之前,我可以让(使用RxJava?)的
getCapabilities()
方法等待服务器的响应吗


提前谢谢

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

将您的吐司移到处理响应的方法中

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

我建议你重建你的类
能力文件夹
类。如果您想像这样使用这个持有者,您不应该在构造函数中请求任何数据。此外,阻止UI线程也是一种不良做法

private CapabilitiesHolder() {
    //empty
}

public Observable<CapabilitiesResponse> getCapabilities() {
    if(capabilities!=null){
        return Observable.fromCallable(() -> capabilities);
    } else {
        return RestServiceFactory.get()
                .getServerCapabilities()
                .doOnNext(capabilitiesResponse -> capabilities = capabilitiesResponse);
    }
}
private capabilitieshalder(){
//空的
}
公共可观测getCapabilities(){
if(能力!=null){
返回Observable.fromCallable(()->能力);
}否则{
返回RestServiceFactory.get()
.getServerCapabilities()
.doOnNext(能力响应->能力=能力响应);
}
}

谢谢您的建议。但正如我提到的,这是一个测试活动,所以Toast将被删除。核心问题是如何使
capabilitiesheld.createIfNotExist().getCapabilities()
在准备好时返回结果,而不是在第一次调用后返回
null
。它不返回null。getCapabilities方法不会(也不应该)阻塞。在Toast方法处,请求尚未完成。您已让回调处理程序设置响应。不管你是在敬酒还是在更新你的用户界面。我就是这么说的