我有一个Android应用程序,它向我的.NET Web Api发出请求。它工作正常,但我需要一些更新,以便为用户提供更好的服务。这给我带来了一些问题。
我在activity_main.xml文件中有用户名,密码文本框和登录按钮。
当用户点击登录按钮时,我正在检查这些值,如果它们是合适的,我会通过我的WebRequest.java类将它们发送到服务器。
这是我的问题:
当我将这些值发送到服务器时,我的主(UI)线程正在锁定。我想使用Thread阻止锁定:
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线程。
我怎样才能做到这一点?
感谢。
答案 0 :(得分:1)
您的问题的解决方案是异步编程中众所周知的模式,通常命名为承诺,期货或延迟。
有关模式的一般性讨论,请参阅:Wikipedia: Futures and promises
在Java中,看一下Future接口,这是一个非常好的教程,一般可以在Lars Vogel's blog找到Java并发。
答案 1 :(得分: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 ......
}
}