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 发送电子邮件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章