1

我在我的 Android 应用程序中登录期间向 API 运行 POST 请求,以获取用户的信息并验证他们的帐户是否存在。NetworkOnMainThreadException当我尝试执行此操作时,我会遇到一个问题。

logger.log(Level.INFO, "POST request URL: "+this.getUrl());
URL url = new URL(this.getUrl());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
logger.log(Level.INFO, "Connection open");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setUseCaches(false);

OutputStream outputStream = connection.getOutputStream();
DataOutputStream wr = new DataOutputStream(outputStream); //ERROR HAPPENS HERE

该异常实际上有一个空错误消息。通过对此异常的研究,我发现这似乎是一个线程问题,我在与此 POST 请求相同的线程上运行 UI。这是真的?

我已经在 Glassfish 上运行的基于 Web 的应用程序上使用了相同的方法,并且效果很好。

4

1 回答 1

5

是的,它是真实的。就响应性而言,在 GUI 线程中运行 IO 东西并不是一个好主意。如果您尝试在 GUI 线程中进行网络操作,这就是 Android 抛出NetworkOnMainThreadException的原因。另请参阅此博客文章,了解为什么会引发此异常。

解决方案很简单,使用 AsyncTask 在单独的线程中进行网络操作。

于 2013-01-01T21:07:16.500 回答