从被调用方法内的函数返回

时间:2018-03-27 23:16:30

标签: java android

我想知道是否可以从被调用方法中包含的函数返回值。

此方法获取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;
}

有一种方法可以在方法内部的代码结果中返回基数的布尔值吗?

2 个答案:

答案 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并将其传递给班级。