无法使用null消息确定NetworkOnMainThreadException的原因

时间:2013-01-01 21:04:48

标签: java android multithreading

我在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的应用程序上完成了相同的方法,并且运行正常。

1 个答案:

答案 0 :(得分:5)

是的,这是真的。关于responsiveness,在GUI线程中运行IO东西不是一个好主意。如果你试图在GUI线程中进行网络操作,这就是Android抛出NetworkOnMainThreadException的原因。另请参阅this blog post,了解抛出此异常的原因。

解决方案很简单,请执行网络操作in a separate thread with AsyncTask