在“onCreate”方法中,我有一行代码,
Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "");
当我在智能手机(Samsung Duos)上运行它时效果很好。但是当我在Toshiba Thrive平板电脑上运行时,我得到"android.os.NetworkOnMainThreadException"
例外
为什么会这样?
答案 0 :(得分:3)
在自3.0
以来的较新版本的Android中,您无法在主UI线程上运行网络活动。
那些会被自动杀死,因为它会导致糟糕的用户体验。
应用程序尝试执行时抛出的异常 在其主线程上进行网络操作。
这仅适用于针对Honeycomb SDK或。的应用程序 更高。允许使用早期SDK版本的应用程序 他们的主要事件循环线程上的网络,但它是很重要的 气馁。
<强> NetworkOnMainThreadException 强>
在不同的主题上运行它,也许使用AsyncTask
答案 1 :(得分:0)
NetworkOnMainThreadException将来自Android OS&gt; = 3.0
因此,请始终在AsyncTask
中运行您的网络请求答案 2 :(得分:0)
private class BackgroundLoginTask extends
AsyncTask<InputStream, Void, Boolean> {
@Override
protected void onPreExecute() {
// do something before..
// Disable the UI-Elements during the login progress
pbar.setVisibility(View.VISIBLE);
editPassword.setEnabled(false);
editUsername.setEnabled(false);
btnLogin.setEnabled(false);
}
@Override
protected Boolean doInBackground(final InputStream... params) {
//do the network access
}
@Override
protected void onPostExecute(final Boolean parsingError) {
// enable the UI-Elements when the login was successful
editPassword.setEnabled(true);
editUsername.setEnabled(true);
btnLogin.setEnabled(true);
// hide the progress bar
pbar.setVisibility(View.INVISIBLE);
}
}
在这个小例子中,您可以看到AsyncTask的工作原理。你可以覆盖3种方法。在开始后台进程之前有一个被调用,一个进行访问,第三个在你完成后台进程后被调用。在我的示例中,我在执行网络访问之前禁用UI元素并显示进度条。访问后,我启用UI元素并禁用onPostExecute方法中的进度条。
在以下代码中,您可以看到如何调用AsyncTask。
public final void login(final View view) {
BackgroundLoginTask task = new BackgroundLoginTask();
task.execute();
}
我希望这个例子可以帮到你。