ser*_*erg 6 java scope callback anonymous-class
我正在使用一些第三方库通过异步协议连接到服务器并获得响应.例如,通过用户名获取userid的方法如下所示:
public int getUserid(String username) {
int userid = 0;
connection.call("getUserid", new Responder() {
public void onResult(final int result) {
System.out.println("userid: " + result);
//how to assign received value to userid and return it?
}
}, username);
//wait for response
while (userid == 0) {
try{
Thread.sleep(100);
} catch (Exception e) {}
}
return userid;
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法从服务器响应中将返回的"结果"分配给方法中的"userid"变量(以便在之后返回).怎么解决这个?我可能可以将它分配给某个类变量而不是方法变量,但我想将它保留在方法范围内,这样我就不必处理并发问题了.
谢谢.
如果我正确理解你的问题,你会问如何从匿名类中编写变量。
匿名类只能访问final变量,而不能直接“写入”它们。
一个“足够好”的简单解决方案是创建一个带有单个值字段以及 getter 和 setter 的 ValueBox 类。然后,您可以在函数中实例化一个新变量作为最终变量,并让您的匿名类访问它。匿名类将使用其 getter 和 setter 进行写入/读取。
该变量是最终变量的事实仅意味着您不能将引用指向其他任何地方,但您仍然可以从任一函数更改引用对象的内容。
您将遇到的更大问题是等待回调被调用。这种等待睡眠可能已经足够好了,但您可能需要考虑超时、线程等,具体取决于您想要实现的目标。
此外,这一切都假设您永远不会在连接上调用此两次。否则,您需要向我们提供有关您的同步模型的更多信息。
这是一些示例代码:
public int getUserid(String username) {
final ValueBox<Integer> userid = new ValueBox<Integer>();
connection.call("getUserid", new Responder() {
public void onResult(final int result) {
System.out.println("userid: " + result);
userId.setValue(result);
//how to assign received value to userid and return it?
}
}, username);
//wait for response
while (userid.isEmpty()) {
try{
Thread.sleep(100);
} catch (Exception e) {}
}
return userid.getValue();
}
Run Code Online (Sandbox Code Playgroud)