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);

但是,这仅适用于 build 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 回答