2014-12-04 55 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