Android デバイスから電子メールを送信するアプリケーションを作成しましたが、電子メールを送信しようとすると次の例外が発生します。
android.os.NetworkOnMainThreadException
なぜこれが発生し、どうすれば修正できますか?
Android デバイスから電子メールを送信するアプリケーションを作成しましたが、電子メールを送信しようとすると次の例外が発生します。
android.os.NetworkOnMainThreadException
なぜこれが発生し、どうすれば修正できますか?
どの SDK バージョン? 14 歳以上の場合は、このリンクを参照してください。
解決策は
デバッグ専用
これらの行を追加
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("");
この例外は、メイン UI スレッドでネットワーク関連の操作を実行しようとしていることを意味します。別のスレッドまたは AsyncTask で行う必要があります。
ドキュメントには次のように記載されています。
アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。これは、 Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。
「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);