web-dev-qa-db-ja.com

AndroidでNetworkonMainThreadExceptionを修正する方法?

私は割り当て用のプロジェクトを作成しています。Androidは初めてで、非常に一般的なURLからjsonにアクセスしたいと思っていましたhttp://api.androidhive.info/contacts/

問題:私はURLを読み取って、このURLから返されたjsonをフェッチして解析しようとしています、

私はすでにAndroidManifest.xmlに次の行を追加しました

<uses-permission Android:name="Android.permission.INTERNET"/>

設定:およびmy Android設定は

<uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="18" />
  1. APIレベル18
  2. Android 4.3

これは私がURLを読み取ろうとしている方法です

static InputStream is = null;

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

エラーメッセージ

11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main
11-02 05:23:47.843: E/AndroidRuntime(2207): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: Android.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at Android.app.ActivityThread.access$600(ActivityThread.Java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1256)

また、私はこのチュートリアルをListViewの例で使用しています http://www.androidhive.info/2011/11/Android-xml-parsing-tutorial/

14
zzlalani

あなたのExceptionは実際にあなたが間違っていることを正確に伝えます。別のスレッドを使用してNetworkOperationsを実行していません。代わりに、UIスレッドでネットワーク操作を実行しますが、これはAndroidでは機能しません(機能しません)。

URLに接続するコードは、たとえばAsyncTasksdoInBackground()メソッド内で実行する必要がありますUIスレッドをオフにします。

AsyncTaskの使用方法に関するこの質問を見てください:AsyncTaskの使用方法

18
Philipp Jahoda

更新された回答:

networkなどの長時間実行される可能性のある操作は、ワーカースレッドで実行する必要があります。

より長い操作のワーカースレッドを作成する最も効果的な方法は、 AsyncTask クラスを使用することです。単に AsyncTask を拡張し、 doInBackground() メソッドを実装して作業を実行します。

Volleyretrofit などのネットワーク操作を実行するための多くのライブラリが利用可能です。


古い回答:

アクティビティonCreateメソッドに次の行を追加します

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
11
Giru Bhai

次のコードを使用します。

private class UpdateTask extends AsyncTask<String, String,String> {
     protected String doInBackground(String... urls) {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
        return null;
     }

 }

そしてあなたのManinActivityで次のコードを使用してください。

new UpdateTask().execute();
9