如何等待方法返回值?异步或同步

时间:2017-04-27 03:20:17

标签: java swing 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);

 }

主页未显示。

2 个答案:

答案 0 :(得分:0)

这里的问题可能是您正在AWT事件线程上执行网络代码。主页最终出现,但同时您的GUI已被冻结。将RMI内容放在一个单独的线程中。

答案 1 :(得分:-1)

我不知道NamingLogin类的外观,但我假设您可以编辑它以使用异步回调,即接口。

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);
        }
    }

}

然后,在您的其他代码中,这就是您等待"

的方式
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);
    }

});