0

我測試了這段代碼,它在2.2和2.3.3上正常工作,但在4.0上崩潰。Android:Http請求在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

e.printstacktrace()會告訴你:

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

當應用程序試圖在其主線程執行 聯網運行時所引發的異常。

這僅適用於針對Honeycomb SDK或 的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上執行聯網,但不鼓勵 。請參閱文檔Designing for Responsiveness。

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

您正在主線程上執行(可能較慢)的網絡操作。如果您的目標SDK爲11或更高,則會拋出NetworkOnMainThreadException,因爲此行爲可能會阻止用戶界面並導致應用程序無響應。

您可以使用AsyncTask來解決這個問題,將數據加載到它的doInBackground(..)中。

1

在詢問崩潰時,通常應該發佈堆棧跟蹤,但在這種情況下,您正在主UI線程上執行網絡操作。這不被推薦,現在引發異常。可以通過另一個線程來完成,也許通過一個AsyncTask來完成。