19

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

問題: URL を読み取って、この URL から返された json を取得して解析しようとしていますが、

AndroidManifest.xml に次の行を既に追加しました

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

設定:そして私のAndroidの設定は

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. APIレベル18
  2. アンドロイド 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 Example http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/のこのチュートリアルに従っています

4

3 に答える 3

19

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

URL に接続するコードは、たとえばAsyncTasks doInBackground()メソッド内で、UI スレッドの外で実行する必要があります。

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

于 2013-11-02T09:36:58.427 に答える
13

更新された回答:

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

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

Volleyレトロフィットなどのネットワーク操作を行うために、多くのライブラリが利用可能です。


古い答え:

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

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
于 2013-11-02T10:04:45.327 に答える
12

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

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();
于 2013-11-02T09:52:13.183 に答える