1

Androidアプリ内でのログイン中にAPIへのPOSTリクエストを実行して、ユーザーの情報を取得し、ユーザーのアカウントが存在することを確認しています。NetworkOnMainThreadException私がこれをやろうとすると、それが私の道を進んでいます。

logger.log(Level.INFO, "POST request URL: "+this.getUrl());
URL url = new URL(this.getUrl());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
logger.log(Level.INFO, "Connection open");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setUseCaches(false);

OutputStream outputStream = connection.getOutputStream();
DataOutputStream wr = new DataOutputStream(outputStream); //ERROR HAPPENS HERE

例外には、実際にはnullエラーメッセージがあります。この例外を調査したところ、このPOSTリクエストと同じスレッドでUIを実行している場合、スレッドの問題のように見えることがわかりました。これは本当ですか?

Glassfishで実行されているWebベースのアプリケーションでこれと同じ方法を実行しましたが、正常に機能しました。

4

1 に答える 1

5

はい、そうです。応答性に関しては、GUIスレッドでIOを実行することはお勧めできません。GUIスレッドでネットワーク操作を行おうとすると、AndroidがNetworkOnMainThreadExceptionをスローするのはそのためです。この例外がスローされる理由については、このブログ投稿も参照してください。

これに対する解決策は簡単です。AsyncTaskを使用して別のスレッドでネットワーク操作を実行してください。

于 2013-01-01T21:07:16.500 に答える