我想知道是否可以从被调用方法中包含的函数返回值。
此方法获取html页面源代码,以便有时间返回值。
但时间不是问题(或者可能是)。
protected boolean booleanLinkReturn(String link) {
boolean ret = false;
Ion.with(getApplicationContext()).load(link).asString().setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String result) {
ret = true;
/*
if I set "ret" here (I can't do btw because it needs to be declared final)
the function will return always false
p.s. I have to do more things here not only the boolean
*/
}
});
return ret;
}
有一种方法可以在方法内部的代码结果中返回基数的布尔值吗?
答案 0 :(得分:2)
不,因为现在没有调用该函数。它将在未来的某个时间被调用(或者也称为永远不可能)。没有办法返回该值,因为它尚未计算,可能永远不会。
执行此操作的正确方法是使所有需要使用该值运行的代码已知放在onCompleted中,或者通过另一个回调函数从那里调用。
答案 1 :(得分:0)
这就是为什么你有机会使用回调。您不知道何时会得到响应(如果您愿意的话),并且回调是一种执行代码以响应事件的方法。
在您的情况下,鉴于您确实需要知道链接是否已打开,您可以更改策略并使回调对字段成员变量起作用,允许由匿名类/ lambdas修改。
这只是一个通用草案:根据您的情况进行调整。
class LinkOpenerAttempt {
private boolean returned = false;
private final String link;
private final Context context;
private final FutureCallback<String> returnCallback = new FutureCallback<String>() {
@Override
public void onCompleted(final Exception e, final String result) {
LinkOpenerAttempt.this.returned = true;
}
};
public LinkOpenerAttempt(final Context context, final String link) {
this.link = link;
this.context = context;
}
public void execute() {
Ion.with(this.context)
.load(link)
.asString()
.setCallback(this.returnCallback);
}
public boolean isReturned() {
return this.returned;
}
}
如果您有理由相信回调将在不同的线程上执行,您可能希望将变量标记为volatile
。
您还可以在活动中声明Callback
并将其传递给班级。