如何从GWT Callback获取服务器变量?数据获取方案咨询
问题解决:异步Callback获取服务器状态失败及替代方案
一、当前问题的原因与解决方法
你遇到的核心问题是异步调用的执行顺序:AsyncServiceRegistry.getUserService().isState()是异步请求,它会在后台线程执行网络交互,而主线程会直接跳过等待,继续执行后续的ApplicationContext.getState()。此时onSuccess方法还没被触发,你拿到的是ApplicationContext里的初始默认值(也就是false),这就是为什么结果始终为false。
正确的做法是把所有依赖服务器返回状态的逻辑,放到onSuccess方法内部执行,同时别忘了处理请求失败的场景:
public static void testCallback(){ AsyncServiceRegistry.getUserService().isState(new AsyncCallback<Boolean>() { @Override public void onFailure(Throwable caught) { // 处理请求失败的情况,比如打印错误日志 System.out.println("获取服务器状态失败:" + caught.getMessage()); } @Override public void onSuccess(Boolean result) { ApplicationContext.setState(result); // 所有依赖state的逻辑必须放在这里,此时才拿到真实的服务器返回值 boolean state = ApplicationContext.getState(); if (state) { System.out.println(true); // do smth if true } else { System.out.println(false); // do smth if false } } }); }
二、从服务器获取数据的其他可选方案
1. 同步调用
如果业务场景允许阻塞等待结果(比如在后台线程执行),可以直接使用同步接口(需服务端提供):
// 注意:仅在非UI线程调用,避免界面卡顿 boolean state = SyncServiceRegistry.getUserService().isState(); // 直接在这里处理state逻辑
2. Future/CompletableFuture(Java 8+)
通过Future类处理异步结果,比传统Callback更灵活,支持链式调用:
CompletableFuture<Boolean> stateFuture = AsyncServiceRegistry.getUserService().isStateAsync(); stateFuture.thenAccept(result -> { ApplicationContext.setState(result); // 处理结果逻辑 if (result) { System.out.println(true); } else { System.out.println(false); } }).exceptionally(caught -> { // 处理请求异常 System.out.println("请求失败:" + caught.getMessage()); return false; });
3. RxJava响应式编程
适合复杂异步场景,支持线程调度和链式操作:
Observable<Boolean> stateObservable = AsyncServiceRegistry.getUserService().getStateObservable(); stateObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) // Android平台切换到主线程 .subscribe(result -> { ApplicationContext.setState(result); // 处理结果 }, error -> { // 处理错误 });
4. Kotlin协程
用协程将异步代码写成同步风格,代码更简洁:
fun testCoroutine() = CoroutineScope(Dispatchers.IO).launch { try { val state = AsyncServiceRegistry.getUserService().isStateSuspend() withContext(Dispatchers.Main) { ApplicationContext.setState(state) // 处理结果逻辑 } } catch (e: Exception) { // 处理异常 } }
内容的提问来源于stack exchange,提问作者Ubuntu Learner
相关产品推荐
相关产品推荐

