Android 如何将此代码插入AsynTask
我有一段带有listview和json响应的代码,但是它抛出了错误“NetworkOnMainException”,我想这就是为什么我在没有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
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);对工作正常,但我在这方面还有其他问题