1

在“onCreate”方法中,我有一行代码,

Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), "");

当我在智能手机(Samsung Duos)上运行它时,它运行良好。但是当我在东芝 Thrive 平板电脑上运行它时,我得到了"android.os.NetworkOnMainThreadException"异常。
为什么会这样?

4

3 回答 3

3

在较新版本的 Android3.0中,您无法在主 UI 线程上运行网络活动。那些会被自动杀死,因为无论如何它都会导致糟糕的用户体验。

当应用程序尝试在其主线程上执行网络操作时引发的异常。

这仅针对面向 Honeycomb SDK 或更高版本的应用程序抛出。允许以早期 SDK 版本为目标的应用程序在其主事件循环线程上进行网络连接,但非常不鼓励这样做。

NetworkOnMainThreadException

在不同的线程上运行它,也许使用AsyncTask

于 2012-10-29T08:01:47.927 回答
0

NetworkOnMainThreadException将出现在 android OS >=3.0

所以总是在AsyncTask中运行你的网络请求

于 2012-10-29T08:00:53.830 回答
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();
}

我希望这个例子可以帮助你。

于 2012-10-29T08:30:31.113 回答