2016-06-25 39 views
1

我有Java代码大致是这样的:返回在内部回调获得一个字符串从外部函数

public String render(String str) { 
    byte[] b = [serialize str] 
    client.sendRequest(b, new Callback<byte[]>() { 
    @Override 
    public void onDone(byte[] data) { 
     String res = [convert data back to String] 
     // TODO: return this string in the outer function 
    }); 
    return "???"; 
} 

我有问题越来越呈现函数返回,我从获得的字符串onDone回调。我尝试初始化SendRequest调用之外的String res,但遇到变量不是最终的问题。

我也在阅读Java期货here。从那以后,我想我可以设置一个Future,然后调用isDone()来确保它已设置?然而,这段代码看起来很冗长,我想知道是否有更简单的解决方案。

+0

这里没有要求/相关的序列化。无论存在什么问题 - 范围/时间安排问题 - 都将继续取消任何提及。 IE浏览器。尝试“返回数据”,这不会出于相同的概念原因。使用一个异步代码,模型*必须完全切换到一个异步模型(包括Futures,它只是推迟决策,或者在回调中进一步处理),或者使用同步方法(可以包括'同步等待异步方法去完成')。 – user2864740

回答

1

我有问题让渲染函数返回从onDone回调中获得的字符串。我尝试初始化SendRequest调用之外的String res,但遇到变量不是最终的问题。

您不能从匿名类更改基元或不可变类型的最终变量,也不能访问非最终变量。所以,你可以:

命名的内部类,而不是可变类的匿名

  • 使用最终目标

    • 使用(StringBuilder的或的StringBuffer)

    • 创建可变类,这将是刚刚的“持有人”所需值,创建其类型的最终变量,并从匿名类中为其设置值;或者为了相同的目的使用所需类型的数组。

    [见this]

    但返回从外部函数值之前,你显然不应该等到匿名类的方法将完成其工作。

  • +0

    谢谢,我查看了链接,并尝试使用该解决方案,通过最终的String []和设置索引0,但有人告诉我,如果我在单独的线程上运行,那么第0个索引不能保证设置。我最终使用ArrayBlockingQueue来实现这个同步行为。 –

    相关问题