メインUIスレッドでネットワーク呼び出しを行っているため、android.os.NetworkOnMainThreadExceptionが発生します。代わりに asynctask を使用してください。
asynctask のドキュメント。http://developer.android.com/reference/android/os/AsyncTask.html。
UI スレッドで AsyncTask を呼び出します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new MyDownloadTask().execute();
}
class MyDownloadTask extends AsyncTask<Void,Void,Void>
{
protected void onPreExecute() {
//display progress dialog.
}
protected Long doInBackground(Void... params) {
URL url = new URL("http://www.google.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
String responseMsg = con.getResponseMessage();
int response = con.getResponseCode();
return null;
}
protected void onPostExecute(VOid result) {
// dismiss progress dialog and update ui
}
}
注: AsyncTask は、Thread と Handler のヘルパー クラスとして設計されており、一般的なスレッド フレームワークを構成するものではありません。AsyncTasks は、理想的には短い操作 (せいぜい数秒) に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、次のような java.util.concurrent パッケージで提供されるさまざまな API を使用することを強くお勧めします。 Executor、ThreadPoolExecutor、および FutureTask。
ロボスパイスの asynctask の代替。https://github.com/octo-online/robospice .
ロボスパイスの特徴の一部。
1. 非同期で (バックグラウンド AndroidService で) ネットワーク リクエストを実行します (例: Spring Android を使用した REST リクエスト)。
2.強く型付けされている!POJO を使用してリクエストを行い、リクエスト結果として POJO を取得します。
3. リクエストに使用される POJO にも、プロジェクトで使用するアクティビティ クラスにも制約を適用しません。
4. 結果をキャッシュします (Json と Gson の両方、Xml、フラット テキスト ファイル、バイナリ ファイル、ORM Lite を使用した場合でも)。
5. アクティビティ (またはその他のコンテキスト) に、ネットワーク リクエストの結果がまだ有効である場合にのみ通知します
6. Android AsyncTasks とは異なり、Android ローダーのようにメモリ リークがまったく発生せず、UI スレッドでアクティビティが通知されます。
7. シンプルだが堅牢な例外処理モデルを使用します。