如何等待一个方法return一个值?异步或同步
How to wait for a method to return a value? Asynchronous or synchronous
我有一个 Java swing 应用程序。登录页面正在调用服务器的方法,如果身份验证为真,将显示主页。
我面临的问题是登录后主页没有出现。
我认为这是因为远程方法调用的响应时间长。
这是我的代码。
Login l=(Login) Naming.lookup("rmi://xxxx/yyyy");
if(l.validate(uname,pass).equals("success"))
{
l.login();//here login will make some registry entry in the server and taking more time
HomePage h=new HomePage();
h.setvisible(true);
}
主页未显示。
我不知道 Naming
或 Login
class 是什么样子,但我假设您可以编辑它以使用异步回调,即接口。
public class Login {
// Interface callback here
public interface OnLoginListener {
void onSuccess(String username);
void onError(String message);
}
// Added as a parameter here
public void validate(String uname, String pass, OnLoginListener callback) {
// TODO: However you did this, it should be a blocking call
String response = tryLogin(uname, pass);
boolean errorCondition = false; // TODO: Implement
if (errorCondition && callback != null) {
callback.onError("Login failed");
return;
}
if (response.equals("success") && callback != null) {
callback.onSuccess(uname);
}
}
}
然后,在您的其他代码中,这就是您 "wait"
final Login l=(Login) Naming.lookup("rmi://xxxx/yyyy");
// Passed in to run asynchronously based on internal method behavior
l.validate(uname,pass, new Login.OnLoginListener() {
@Override
public void onSuccess(String username) {
l.login();
HomePage h=new HomePage();
h.setvisible(true);
}
@Override
public void onError(String message) {
System.err.println(message);
}
});
这里的问题似乎是您正在 AWT 事件线程上执行网络代码。主页 最终会 出现,但同时您的 GUI 已被冻结。在单独的线程中执行 RMI 操作。
我有一个 Java swing 应用程序。登录页面正在调用服务器的方法,如果身份验证为真,将显示主页。
我面临的问题是登录后主页没有出现。
我认为这是因为远程方法调用的响应时间长。
这是我的代码。
Login l=(Login) Naming.lookup("rmi://xxxx/yyyy");
if(l.validate(uname,pass).equals("success"))
{
l.login();//here login will make some registry entry in the server and taking more time
HomePage h=new HomePage();
h.setvisible(true);
}
主页未显示。
我不知道 Naming
或 Login
class 是什么样子,但我假设您可以编辑它以使用异步回调,即接口。
public class Login {
// Interface callback here
public interface OnLoginListener {
void onSuccess(String username);
void onError(String message);
}
// Added as a parameter here
public void validate(String uname, String pass, OnLoginListener callback) {
// TODO: However you did this, it should be a blocking call
String response = tryLogin(uname, pass);
boolean errorCondition = false; // TODO: Implement
if (errorCondition && callback != null) {
callback.onError("Login failed");
return;
}
if (response.equals("success") && callback != null) {
callback.onSuccess(uname);
}
}
}
然后,在您的其他代码中,这就是您 "wait"
final Login l=(Login) Naming.lookup("rmi://xxxx/yyyy");
// Passed in to run asynchronously based on internal method behavior
l.validate(uname,pass, new Login.OnLoginListener() {
@Override
public void onSuccess(String username) {
l.login();
HomePage h=new HomePage();
h.setvisible(true);
}
@Override
public void onError(String message) {
System.err.println(message);
}
});
这里的问题似乎是您正在 AWT 事件线程上执行网络代码。主页 最终会 出现,但同时您的 GUI 已被冻结。在单独的线程中执行 RMI 操作。