14

接続するコードは次のとおりHTTPです。

URL url = new URL("http://www.google.com");
              HttpURLConnection con = (HttpURLConnection) url.openConnection();
              con.setDoOutput(true);
              String responseMsg = con.getResponseMessage();
              int response = con.getResponseCode();

これは投げているandroid.os.NetworkOnMainThreadException

助けてください。

4

2 に答える 2

36

メイン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. シンプルだが堅牢な例外処理モデルを使用します。

于 2013-03-19T09:59:43.200 に答える
5

NetworkOnMainThreadException : アプリケーションがメイン スレッドでネットワーク操作を実行しようとしたときにスローされる例外。

asynctask で sendfeedback メソッドを呼び出す必要があります。そうすれば、上記のコードのみが機能します。Web サーバーの応答に時間がかかるため、メイン スレッドが応答しなくなります。それを避けるには、別のスレッドで呼び出す必要があります。したがって、asynctask の方が優れています。

http://android-developers.blogspot.in/2009/05/painless-threading.html

于 2013-03-19T09:59:55.737 に答える