java - Android HttpPost 和多线程的一些问题

标签 java android multithreading http-post

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

我在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方法返回并尝试获取response变量的值。 loginThread 尚未完成其工作,这就是响应为 null 的原因。

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

最后,我想要执行此请求,但不想锁定 UI 线程。

我怎样才能实现这一目标?

谢谢。

最佳答案

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

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

在 Java 中,查看 Future接口(interface),关于这个和 Java 并发性的非常好的教程可以在 Lars Vogel's blog 找到。 .

关于java - Android HttpPost 和多线程的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502673/

相关文章:

java - 调用 "servant_to_reference"后丢弃 CORBA 中的仆人

java - dbunit 测试失败并出现 NoSuchTableException,但表存在

android - Activity 泄露了最初绑定(bind)在这里的 ServiceConnection com.google.android.youtube.player

c# - 跨线程拆分工作

java - JDBC SQL Server 异常

java - OSGI:DS 和组件工厂问题

android - 通过 Titanium 进行地理定位

android - TextView 返回 null

c# - 启动和等待多个线程 - Resharper 提示修改后的闭包

c# - 如何实现数据大小限制的缓存?