2012-06-21 3 views
0

Можно создать дубликат:
Strange NetworkOnMainThreadException in Android app?
Trying To Upload To Dropbox: NetworkOnMainThreadException?Почему это не работает для ICS

я использовал следующий код для чтения содержимого HTML из URL. Это отлично работает для 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 Раджеш. В ICS там будет исключение ** NetworkOnMainThreadException **, если вы не реализовали AsyncTask или AsyncTaskLoader. –

+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; 
     } 
Смежные вопросы