Android 如何将此代码插入AsynTask

Android 如何将此代码插入AsynTask,android,json,Android,Json,我有一段带有listview和json响应的代码,但是它抛出了错误“NetworkOnMainException”,我想这就是为什么我在没有AsynTask的情况下执行它的原因,真的吗?但我不知道该怎么说。谢谢 代码是: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanc

我有一段带有listview和json响应的代码,但是它抛出了错误“NetworkOnMainException”,我想这就是为什么我在没有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);
    }
    }
公共类MainActivity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView lvCities=(ListView)findViewById(R.id.lv_cities);
ArrayList citiesAvaiable=新的ArrayList();
试一试{
//Lalamamos al-servicio web para Recipular los datos
HttpGet HttpGet=新的HttpGet(“http://comupunt.esy.es/cities.php");
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse response=(HttpResponse)httpClient.execute(httpGet);
HttpEntity=response.getEntity();
BufferedHttpEntity buffer=新BufferedHttpEntity(实体);
InputStream iStream=buffer.getContent();
字符串aux=“”;
BufferedReader r=新的BufferedReader(新的InputStreamReader(iStream));
StringBuilder总计=新StringBuilder();
弦线;
而((line=r.readLine())!=null){
aux+=线路;
}
//为服务对象提供服务
JSONObject JSONObject=新JSONObject(aux);
JSONArray cities=jsonObject.getJSONArray(“城市”);
//雷科雷莫斯el阵列城市酒店
对于(int i=0;i
您不能在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);
        }

    }
}
公共类MainActivity扩展活动{
城市列表视图;
ArrayList citiesAvaiable=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvCities=(ListView)findViewById(R.id.lv_cities);
AsyncExecute asynctask=新建AsyncExecute();
asynctask.execute();
}
//用于执行网络操作的asynctask内部类
类AsyncExecute扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
//Lalamamos al-servicio web para Recipular los datos
HttpGet HttpGet=新的HttpGet(“http://comupunt.esy.es/cities.php");
HttpClient HttpClient=新的DefaultHttpClient();
HttpResponse response=(HttpResponse)httpClient.execute(httpGet);
HttpEntity=response.getEntity();
BufferedHttpEntity buffer=新BufferedHttpEntity(实体);
InputStream iStream=buffer.getContent();
字符串aux=“”;
BufferedReader r=新的BufferedReader(新的InputStreamReader(iStream));
StringBuilder总计=新StringBuilder();
弦线;
而((line=r.readLine())!=null){
aux+=线路;
}
//为服务对象提供服务
JSONObject JSONObject=新JSONObject(aux);
JSONArray cities=jsonObject.getJSONArray(“城市”);
//雷科雷莫斯el阵列城市酒店
对于(int i=0;i
developer.android.com为学习目的提供了非常好的文档,请学习下面的链接,以便清楚地了解您需要做什么


这是一个错误,因为您正在主线程上运行它。您可以使用AsyncTask,但也可以使用不带Async的其他线程。谢谢!但是我有一个错误:CityAdapter CityAdapter=new CityAdapter(这个,citiesaviable);构造函数CityAdapter(mainActivity.AsyncExecute,ArrayList)为undefined@AitorRamosPajares试试这个,CityAdapter CityAdapter=new CityAdapter(main activity.this,citiesaviable);对工作正常,但我在这方面还有其他问题