如何在Android上解决HttpGet的问题?

时间:2012-07-07 21:18:28

标签: java android

我在Android上编写代码来获取请求,但我的错误是这样的:

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


}

我做错了什么或我有什么解决这个问题?

3 个答案:

答案 0 :(得分:6)

尝试将此代码放入方法onCreate()

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

但是这仅适用于构建sdk版本9及更高版本

答案 1 :(得分:4)

在使用Inputstream时,您正在使用主线程,这就像在网络上工作一样。阅读doInBackground()处理程序中的全部内容,你应该没问题

答案 2 :(得分:0)

onPostExecute()方法在主UI线程上运行。您没有在其中使用任何UI元素,那么为什么要在UI线程中包含所有这些语句。只需在返回语句之前将所有这些语句移动到doInBackground(),并尝试是否有效。