android.os.NetworkOnMainThreadException 从 Android 发送电子邮件 [重复]

Posted

技术标签:

【中文标题】android.os.NetworkOnMainThreadException 从 Android 发送电子邮件 [重复]【英文标题】:android.os.NetworkOnMainThreadException sending an email from Android [duplicate] 【发布时间】:2013-08-20 06:53:01 【问题描述】:

我编写了一个从 android 设备发送电子邮件的应用程序,但是当我尝试发送电子邮件时出现以下异常:

android.os.NetworkOnMainThreadException

为什么会发生这种情况,我该如何解决?

【问题讨论】:

因为你在UI线程上做网络操作。 在后台线程上做所有网络相关的操作。 【参考方案1】:

哪个 SDK 版本?如果 14 岁以上,请参阅 this link。

解决办法是

仅用于调试

添加这些行

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

真实案例

将代码放在 AsyncTask 上:

private class Connection extends AsyncTask 
    @Override
    protected Object doInBackground(Object... arg0) 

        connect();
        return null;
    

然后调用:

new Connection().execute("");

【讨论】:

好的,感谢使用 StrictMode 解决 不要在生产模式下使用 StrictMode,使用 AsyncTask @user2693552 只是为了添加 venergiac 所说的内容 - 这不是解决您的问题的方法,它是一种解决方法,因此您可以测试 其他部分 您的应用程序正在运行,您必须稍后将此网络操作移至另一个线程。由于您的应用程序似乎需要将此网络操作作为关键组件,因此我建议现在对其进行整理,而不必费心设置此线程策略。 正确的调用模式是 Connection().execute("");【参考方案2】:

此异常表示您正尝试在主 UI 线程上执行 network 相关操作。您需要在单独的线程或 AsyncTask 中执行。

documentation 说:

当应用程序尝试执行 在其主线程上进行网络操作。这仅适用于应用程序 针对Honeycomb SDK 或更高版本。针对早期 SDK 的应用程序 允许版本在其主事件循环线程上进行联网,但它是 非常气馁。

请参阅 How can I fix 'android.os.NetworkOnMainThreadException'?Android - android.os.NetworkOnMainThreadException 了解更多信息。

类似:

class RetreiveFeedTask extends AsyncTask<String, Void, Void> 

    protected Void doInBackground(String... urls) 
        // Execute the network related option here
    

    protected void onPostExecute(Void param) 

        // TODO: do something with the feed
    

这是执行任务的方法:

new RetreiveFeedTask().execute(urlToRssFeed);

【讨论】:

是的,我知道但如何解决? 正如我所说,将代码放入 AsyncTask 或启动一个新线程。您可以转到我提到的那些链接了解更多信息。

以上是关于android.os.NetworkOnMainThreadException 从 Android 发送电子邮件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章