Toshiba Thrive选项卡上的android.os.NetworkOnMainThreadException,但三星Duos智能手机上没有

时间:2012-10-29 07:59:43

标签: android exception tabs smartphone

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

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

当我在智能手机(Samsung Duos)上运行它时效果很好。但是当我在Toshiba Thrive平板电脑上运行时,我得到"android.os.NetworkOnMainThreadException"例外 为什么会这样?

3 个答案:

答案 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();
}

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