【问题标题】:How to wait for a method to return a value? Asynchronous or synchronous如何等待方法返回值?异步或同步
【发布时间】:2017-09-24 16:14:01
【问题描述】:

我有一个 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);

 }

主页没有出现。

【问题讨论】:

  • 非常有趣的是程序在 ecplise 中运行良好,但是当我构建一个 jar 时它不工作。可能是 ecplise 有一些不同的线程执行方法
  • 那么怎么同步(this){if(l.validate(uname,pass).equals("success")){l.login();HomePage h=new HomePage() ;h.setvisible(true);}}
  • 当你通过eclipse运行时会出现主页吗?
  • 是的,它出现了。它有什么样的错误
  • 我不明白使用synchronized 对您有何帮助(确保您拼写正确)。也许查找或登录失败并产生异常,这将阻止主页显示。检查您的日志以查看是否有任何类型的堆栈跟踪。

标签: java swing rmi


【解决方案1】:

这里的问题似乎是您正在 AWT 事件线程上执行网络代码。主页最终出现,但同时您的 GUI 已被冻结。在单独的线程中执行 RMI 工作。

【讨论】:

  • @programmer 我不是投票猎犬,但很奇怪你接受了一个不起作用的答案。
【解决方案2】:

我不知道 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);
    }

});

【讨论】:

  • 你应该解释你的代码而不是仅仅转储一个答案
  • 不知道除了我添加的 cmets 还有什么要解释的
  • 我可以在远程调用中使用这样的接口还是会抛出一些 rmi.stub 错误
  • 你定义你自己的接口...如果你不这样做为什么会抛出错误?
  • 这根本行不通。 LoginListener 不是 Serializable,所以它不能作为远程方法的参数传递。它不可能按要求工作,除非LoginListener 扩展Remote 并被实例化为导出的远程对象:否则回调将在服务器上执行。注意Naming 是 JRE 的一部分,并且 (2) Login 是远程接口,而不是类。
猜你喜欢
  • 2013-07-24
  • 2013-02-14
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多