2012-02-25 6 views
2

Когда я пытаюсь прочитать одну строку текста с сайта, я получаю ошибку (NetworkOnMainThreadException). Я попробовал немного, но пока ничего не работает. Итак, вот код, если кто-то может помочь. В манифесте у меня есть разрешение на интернет, так что он не должен быть проблемой.NetworkOnMainThreadException При чтении из Интернета

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

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

import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Weather extends Activity { 

    Button button; 
    TextView t; 
    String result; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.weather); 

     t = (TextView)findViewById(R.id.textView1); 

    } 

    public void myButtonClickHandler (View view) throws ClientProtocolException, IOException { 
     result = getContentFromUrl("http://url.com"); 
     t.setText(result); 
    } 

    public static String getContentFromUrl(String url) throws ClientProtocolException, IOException { 

     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse response; 

     response = httpClient.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 

     if(entity != null) { 

      InputStream inStream = entity.getContent(); 

      String result = Weather.convertStreamToString(inStream); 
      inStream.close(); 

      return result; 
     } 

     return null; 

    } 

    private static String convertStreamToString(InputStream is) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line = null; 

     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 
} 

ответ

7

не использует сетевые действия в основной теме. Это исключение выбрано для приложений, ориентированных на SDK Honeycomb или выше. выполнять всю связанную с сетью задачу в отдельном потоке (либо использовать обработчик обработчика, либо runOnUiThread). ваша проблема будет решена.

+0

Humm, не могли бы вы привести мне пример? – HyperX

+1

вы можете увидеть на примере http://www.vogella.de/articles/AndroidPerformance/article.html и http://www.xoriant.com/blog/mobile-application-development/android-async-task.html и http://developer.android.com/resources/articles/painless-threading.html –

4

Либо вы можете переместить его в фоновый поток, или если вы просто хотите устранить эту ошибку просто добавьте это в OnCreate():

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

    StrictMode.setThreadPolicy(policy); 

не забудьте добавить разрешение Интернет в манифесте:

<uses-permission android:name="android.permission.INTERNET"/> 
Смежные вопросы