2014-12-04 39 views
0

我有這個代碼與ListView和JSON響應,但它會引發錯誤「NetworkOnMainException」,我認爲這個錯誤是爲什麼我沒有AsynTask執行它,真的嗎?但我不知道我該如何表達。感謝如何插入此代碼到AsynTask

代碼:

public class MainActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ListView lvCities = (ListView) findViewById(R.id.lv_cities); 
     ArrayList<City> citiesAvaiable = new ArrayList<City>(); 

     try { 
     // Llamamos al servicio web para recuperar los datos 
     HttpGet httpGet = new HttpGet("http://comupunt.esy.es/cities.php"); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpResponse response = (HttpResponse)httpClient.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     BufferedHttpEntity buffer = new BufferedHttpEntity(entity); 
     InputStream iStream = buffer.getContent(); 

     String aux = ""; 

     BufferedReader r = new BufferedReader(new InputStreamReader(iStream)); 
     StringBuilder total = new StringBuilder(); 
     String line; 
     while ((line = r.readLine()) != null) { 
      aux += line; 
     } 

     // Parseamos la respuesta obtenida del servidor a un objeto JSON  
     JSONObject jsonObject = new JSONObject(aux); 
     JSONArray cities = jsonObject.getJSONArray("cities"); 

     // Recorremos el array con los elementos cities 
     for(int i = 0; i < cities.length(); i++) { 
      JSONObject city = cities.getJSONObject(i); 

      // Creamos el objeto City 
      City c = new City(city.getInt("name"), city.getString("nametwo")); 
      c.setData(city.getString("photo")); 

      // Almacenamos el objeto en el array que hemos creado anteriormente 
      citiesAvaiable.add(c); 
     } 
     } 
     catch(Exception e) { 
     e.printStackTrace(); 
     } 

     // Creamos el objeto CityAdapter y lo asignamos al ListView 
     CityAdapter cityAdapter = new CityAdapter(this, citiesAvaiable); 
     lvCities.setAdapter(cityAdapter); 
    } 
    } 
+0

這是錯誤的,因爲你正在主線程上運行它。您可以使用AsyncTask,但也可以使用其他線程而不使用Async。 – 2014-12-04 08:46:42

回答

2

你不能在UI線程上執行網絡I/O。從技術上講,它可能在Android的早期版本(3.0之前),但它是一個非常糟糕的主意,因爲它會導致您的應用程序停止響應,並可能導致操作系統殺死你的應用程序表現不佳。您需要運行後臺進程或使用AsyncTask在後臺線程上執行網絡事務。

嘗試這樣的代碼,

public class MainActivity extends Activity { 

    ListView lvCities; 
    ArrayList<City> citiesAvaiable = new ArrayList<City>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lvCities = (ListView) findViewById(R.id.lv_cities); 
     AsyncExecute asynctask = new asyncExecute(); 
     asynctask.execute(); 

    } 


    //An asynctask inner class for performing network operation 
    class AsyncExecute extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
        // Llamamos al servicio web para recuperar los datos 
        HttpGet httpGet = new HttpGet("http://comupunt.esy.es/cities.php"); 
        HttpClient httpClient = new DefaultHttpClient(); 
        HttpResponse response = (HttpResponse)httpClient.execute(httpGet); 
        HttpEntity entity = response.getEntity(); 
        BufferedHttpEntity buffer = new BufferedHttpEntity(entity); 
        InputStream iStream = buffer.getContent(); 

        String aux = ""; 

        BufferedReader r = new BufferedReader(new InputStreamReader(iStream)); 
        StringBuilder total = new StringBuilder(); 
        String line; 
        while ((line = r.readLine()) != null) { 
         aux += line; 
        } 

        // Parseamos la respuesta obtenida del servidor a un objeto JSON  
        JSONObject jsonObject = new JSONObject(aux); 
        JSONArray cities = jsonObject.getJSONArray("cities"); 

        // Recorremos el array con los elementos cities 
        for(int i = 0; i < cities.length(); i++) { 
         JSONObject city = cities.getJSONObject(i); 

         // Creamos el objeto City 
         City c = new City(city.getInt("name"), city.getString("nametwo")); 
         c.setData(city.getString("photo")); 

         // Almacenamos el objeto en el array que hemos creado anteriormente 
         citiesAvaiable.add(c); 

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


     @Override 
     protected void onPostExecute(Void result) { 
      // Creamos el objeto CityAdapter y lo asignamos al ListView 
      CityAdapter cityAdapter = new CityAdapter(MainActivity.this, citiesAvaiable); 
      lvCities.setAdapter(cityAdapter); 
      super.onPostExecute(result); 
     } 

    } 
} 
+0

謝謝!但我有一個錯誤:CityAdapter cityAdapter = new CityAdapter(this,citiesAvaiable);構造函數CityAdapter(MainActitivy.AsyncExecute,ArrayList )未定義 – 2014-12-04 08:56:00

+0

@AitorRamosPajares試試這個,CityAdapter cityAdapter = new CityAdapter(MainActivity.this,citiesAvaiable); – sam 2014-12-04 08:56:54

+0

@AitorRamosPajares現在在工作嗎? – sam 2014-12-04 09:00:45