Rx Android-等待服务器响应
我在Android应用程序中使用RxJava并进行改装,以从服务器获取数据。我有这个代码的测试活动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);
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方法处,请求尚未完成。您已让回调处理程序设置响应。不管你是在敬酒还是在更新你的用户界面。我就是这么说的