0

Androidでgetリクエストを行うコードを記述しましたが、次のようなエラーが発生します。

07-07 21:12:39.674: E/AndroidRuntime(2409):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)

だから私はAsyncTaskを使わなければならないことを読んだ。やったよ。あるときはうまくいきましたが、次回アプリを実行すると、再びそのエラーが発生しました。

これは私のコードです:

package app.teksty;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;



public class MainActivity extends Activity {


    private class HttpGetRequest extends AsyncTask<String, Integer, Void>
    {

        private InputStream content;

        @Override
        protected Void doInBackground(String... params) {

              String url = params[0];
              Log.i("[GET REQUEST]", "STARTED");
              try {
                  HttpClient httpclient = new DefaultHttpClient();
                  HttpResponse response = httpclient.execute(new HttpGet(url));
                  content = response.getEntity().getContent();
              } catch (Exception e) {
                  Log.e("[GET REQUEST]", "Network exception", e);
              }

              return null;

        }

        @Override
        protected void onPostExecute(Void result) { 
            super.onPostExecute(result);

            BufferedReader r = new BufferedReader(new InputStreamReader(content));
            StringBuilder respond = new StringBuilder();
            String line;
            try {

                while ((line = r.readLine()) != null) {
                    respond.append(line);
                }

                Log.i("[GET REQUEST]", respond.toString());

            } catch (IOException e) {

                Log.e("[GET REQUEST]", "", e);
            }

        }


    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new HttpGetRequest().execute("http://www.google.pl");

        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


}

私が間違ったこと、またはこの問題を解決するために何をしなければならないのですか?

4

3 に答える 3

6

このコードをメソッドに入れてみてくださいonCreate()

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

ただし、これはビルドSDKバージョン9以降でのみ機能します

于 2013-03-22T09:57:53.360 に答える
4

Inputstreamで作業している間、メインスレッドで作業しており、それはネットワークで作業していると見なされます。doInBackground()ハンドラーでコンテンツ全体を読んでください。問題ないはずです。

于 2012-07-07T21:38:30.313 に答える
0

このonPostExecute()メソッドはメインUIスレッドで実行されます。UI要素を使用していないので、これらすべてのステートメントをUIスレッドに含めるのはなぜですか。doInBackground()returnステートメントの前に、これらすべてのステートメントを最後に移動して、それが機能するかどうかを試してください。

于 2012-07-07T22:02:09.680 に答える