2012-06-21 125 views
0

可能重复:
Strange NetworkOnMainThreadException in Android app?
Trying To Upload To Dropbox: NetworkOnMainThreadException?为什么这不会对ICS工作

我用下面的代码从一个URL读取HTML内容。这适用于2.3.3,但当我尝试运行相同的代码时,它不适用于ICS。

我试图将这些HTML内容追加到edittext。但是当我在ICS上运行代码时,它始终是空的。可能是什么问题?

public class Quiz1Activity extends Activity { 
    private static BufferedReader reader = null; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

EditText ed = (EditText) findViewById(R.id.editText1); 

     try { 
      ed.append(getStringFromUrl("http://www.google.com")); 
      //getInputStreamFromUrl("").close(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static InputStream getInputStreamFromUrl(String url){ 
      InputStream contentStream = null; 

      try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = httpclient.execute(new HttpGet(url)); 
      contentStream = response.getEntity().getContent(); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
      System.out.println("Content stream is " + contentStream); 
      return contentStream; 
     } 

    public static String getStringFromUrl(String url) throws IOException{ 
     reader = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url))); 

     StringBuilder sb = new StringBuilder(); 
     try{ 
     String line = null; 
     while((line = reader.readLine()) != null) 
     { 
      sb.append(line); 
     }  
     }catch (IOException e){ 
     e.printStackTrace(); 
     } 
     getInputStreamFromUrl(url).close(); 
     return sb.toString(); 
    } 
} 
+3

这里http://stackoverflow.com/阅读我的答案a/10892925/1321873 – Rajesh

+0

+1 Rajesh。在ICS中,如果您尚未实现AsyncTask或AsyncTaskLoader,则会出现** NetworkOnMainThreadException **异常。 –

+0

更好的是你已经试图看看Logcat输出。 –

回答

2

像@Vipul沙阿说你要getInputStreamFromUrl()移动到另一个线程使用异步任务,这是对ICS的工作:

package com.home.anas; 

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

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

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.EditText; 

public class WebPageContentActivity extends Activity { 
    private EditText ed; 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ed = (EditText) findViewById(R.id.editText1); 
     readWebpage(); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      String response = ""; 
      for (String url : urls) { 
       DefaultHttpClient client = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(url); 
       try { 
        HttpResponse execute = client.execute(httpGet); 
        InputStream content = execute.getEntity().getContent(); 

        BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
        String s = ""; 
        while ((s = buffer.readLine()) != null) { 
         response += s; 
        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      ed.setText(result); 
     } 
    } 

    public void readWebpage() { 
     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] { "http://www.google.com" }); 

    } 
} 
0

但是,当我运行ICS代码它始终保持为空。可能是什么问题?

问题是ICS不允许您在主线程上执行异步任务,因此请将您的异步移至新线程。

你应该在下面的代码中移动单独的线程。

public static InputStream getInputStreamFromUrl(String url){ 
      InputStream contentStream = null; 

      try{ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpResponse response = httpclient.execute(new HttpGet(url)); 
      contentStream = response.getEntity().getContent(); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
      System.out.println("Content stream is " + contentStream); 
      return contentStream; 
     }