Android:Http请求在4.0上不起作用

时间:2012-12-18 20:13:50

标签: android httpwebrequest compatibility android-compatibility

我测试了这段代码,它在2.2和2.3.3上工作正常,但它在4.0上崩溃。

问题似乎与http请求有关。有什么想法吗?

public class Rezultat extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    //http post
    InputStream is=null;
    try{

            String url="http://google.com";
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
    }catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());
    }
    //convert response to string
    try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();

            result=sb.toString();

    }catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }

3 个答案:

答案 0 :(得分:3)

e.printstacktrace()会告诉你:

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

  

应用程序尝试执行时抛出的异常   在其主线程上进行网络操作。

     

这仅适用于针对Honeycomb SDK或。的应用程序   更高。允许使用早期SDK版本的应用程序   他们的主要事件循环线程上的网络,但它是很重要的   泄气。请参阅文档设计响应性。

private class DownloadFromUrlTask extends AsyncTask<String, Void, Bitmap> {

    protected void onPreExecute() {
        mDialog = ProgressDialog.show(ChartActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    protected String doInBackground(String... urls) {
        //All your network stuff here.
        return result
    }
}

答案 1 :(得分:1)

您正在主线程上执行(可能很慢)网络操作。如果您的目标SDK为11或更高,则会抛出NetworkOnMainThreadException,因为此行为可能会阻止用户界面并导致应用无响应。

您可以使用AsyncTask解决此问题,将数据加载到doInBackground(..)

答案 2 :(得分:1)

通常应该在询问崩溃时发布堆栈跟踪,但在这种情况下,您在主UI线程上执行网络操作。不推荐这样做,现在抛出异常。而是在另一个线程中执行,可能通过AsyncTask。