在“onCreate”方法中,我有一行代码,
Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "");
当我在智能手机(Samsung Duos)上运行它时,它运行良好。但是当我在东芝 Thrive 平板电脑上运行它时,我得到了"android.os.NetworkOnMainThreadException"
异常。
为什么会这样?
在“onCreate”方法中,我有一行代码,
Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "");
当我在智能手机(Samsung Duos)上运行它时,它运行良好。但是当我在东芝 Thrive 平板电脑上运行它时,我得到了"android.os.NetworkOnMainThreadException"
异常。
为什么会这样?
在较新版本的 Android3.0
中,您无法在主 UI 线程上运行网络活动。那些会被自动杀死,因为无论如何它都会导致糟糕的用户体验。
当应用程序尝试在其主线程上执行网络操作时引发的异常。
这仅针对面向 Honeycomb SDK 或更高版本的应用程序抛出。允许以早期 SDK 版本为目标的应用程序在其主事件循环线程上进行网络连接,但非常不鼓励这样做。
在不同的线程上运行它,也许使用AsyncTask
NetworkOnMainThreadException将出现在 android OS >=3.0
所以总是在AsyncTask中运行你的网络请求
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();
}
我希望这个例子可以帮助你。