0

我有一个向我的 .NET Web Api 发出发布请求的 Android 应用程序。它工作正常,但我需要一些更新来为用户提供更好的服务。这给我带来了一些问题。

我在activity_main.xml 文件中有用户名、密码文本框和登录按钮。

当用户单击登录按钮时,我正在检查值,然后如果它们合适,我将通过我的 WebRequest.java 类将它们发送到服务器。

这是我的问题:

当我将这些值发送到服务器时,我的主 (UI) 线程正在锁定。我想防止使用线程锁定:

public static WebLoginResponse loginRequest(final String username, final String password) {
    Thread loginThread = new Thread(new Runnable() {
        @Override
        public void run() {
            // making request here.
        }
    });
    loginThread.start();
}

这可以防止锁定,但响应返回 null。很清楚为什么会这样。因为当我从 MainActivity.java 文件中调用此方法时,例如:

WebLoginResponse response = WebRequests.loginRequest(username, password);

loginThread运行 loginRequest 但 UI 线程从 loginRequest 方法返回并尝试获取响应变量的值。loginThread还没有完成它的工作,这就是为什么响应为空。

这不是我的问题的解决方案,因为响应始终为空。

最后,我想做这个请求,但不想锁定 UI 线程。

我怎样才能做到这一点?

谢谢。

4

2 回答 2

1

您的问题的解决方案是异步编程中众所周知的模式,通常命名为promisesfuturesdelay

有关该模式的一般讨论,请参阅:Wikipedia: Futures and promises

在 Java 中,看看Future接口,关于这个和 Java 并发性的非常好的教程可以在Lars Vogel 的博客上找到。

于 2013-05-12T00:38:32.143 回答
0

您需要在后台线程上执行 Web 访问请求。就个人而言,我使用AsyncTask.

这里有几个链接:

这是一些需要工作的示例代码:

private WebLoginTask mWebLoginTask = null;

public static WebLoginResponse loginRequest(final String username, final String password) {
    mWebLoginTask = new WebLoginTask();
    mWebLoginTask.execute();
}

private class WebLoginTask extends AsyncTask<Void, String, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        if (this.isCancelled() == true) { return null; }

        // ..... do your web stuff here .....
    }

    protected void onPostExecute(Void success) {
        // ..... do stuff here when the web stuff is finished ......
    }
}
于 2013-05-12T00:03:30.230 回答