我在这里有一个小问题。
private boolean isSomethingTrue(String param) {
boolean result = false;
myService.hasAlerts(param,new Callback<Boolean>(
@Override
public void onSuccess(Boolean hasAlerts) {
result = hasAlerts;
}
});
return result;
}
在这段代码中,我如何返回回调中收到的布尔hasAlerts? 这不起作用,因为结果变量不是最终的。 但是当它是最终的时候,它就不能被修改......
我做过类似的事情:
private boolean isSomethingTrue(String param) {
class ResultHolder {
boolean result=false;
}
final ResultHolder resultHolder = new ResultHolder();
myService.findBoolean(param,new Callback<Boolean>(
@Override
public void onSuccess(Boolean hasAlerts) {
resultHolder.result = hasAlerts;
}
});
return resultHolder.result;
}
但处理这种情况是否有更简单的解决方案?
我在尝试调用GWT RPC服务时发现了这个问题。
答案 0 :(得分:3)
我可以想到一些变化 - 没有一个特别令人兴奋。您可以将结果持有者和回调合并到一个类中,如果您可以在其他地方使用它,则将其设置为静态,但这并不是一个改进。
private boolean isSomethingTrue(String param) {
class MyCallback implements Callback<Boolean> {
boolean result = false;
@Override
public void onSuccess(Boolean hasAlerts) {
result = hasAlerts;
}
}
final MyCallback callback = new MyCallback();
myService.findBoolean(param, callback);
return callback.result;
}
您可以实现通用同步Future
,但这可能会产生误导。
最后,如果您经常这样做,您可以对价值持有人进行一般化。
public class Result<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
private boolean isSomethingTrue(String param) {
final Result<Boolean> result = new Result<Boolean>();
myService.findBoolean(param,new Callback<Boolean>(
@Override
public void onSuccess(Boolean hasAlerts) {
result.set(hasAlerts);
}
});
return result.get();
}
答案 1 :(得分:1)
您需要的是同步RPC。有关详细信息,请参阅>here<和>here<。
但我更愿意改变你的编码风格(假设你有权访问调用isSomethingTrue()的代码)。假设你有一些这样的代码调用你的方法isSomethingTrue:
if(isSomethingTrue("foo")) {
doSomeCoolStuff();
}
您可以将其更改为异步编码样式,方法是将其更改为:
isSomethingTrue("foo", new Callback<Boolean>(
@Override
public void onSuccess(Boolean result) {
if(result) {
doSomeCoolStuff();
}
}
});
和
private void isSomethingTrue(String param, Callback callback) {
myService.hasAlerts(param,callback);
}