Problemas de AsyncTasks múltiples en Android Spinner
Estoy recibiendo un error. Sé cuál es el problema, pero no sé cómo solucionarlo.
Tengo 4 spinner. Cada spinner relacionó un asíncrito. Para abreviar, Cuando selecciono un elemento en spinner1, ejecuto segundo asynctask que puebla spinner2 (el elemento seleccionado agrega a segundo asynctask como parámetro) Continúa de esta manera.
- Cómo utilizar AsyncTask
- Cola de tareas en Android como en GCD en iOS?
- Android SeekBar setProgress está haciendo que mi MediaPlayer salte
- Mejora del rendimiento de OpenCV Android: seguimiento rápido de objetos
- Para forzar la cancelación AsyncTask no debería el indicador periódicamente marcado en doInBackground ser volátil?
Pero antes del final del primer asynctask, spinner2 no puede poblar. En este caso estoy recibiendo error. Como arreglarlo ? ¿Cómo hacer cuando termina la primera tarea, trabajo de segunda tarea?
Aquí está el código;
Primera tarea
public class ilceDoldur extends AsyncTask<String[],String[],String[]>{ @Override protected String[] doInBackground(String[]... params) { SoapObject request = new SoapObject(NAMESPACE, "ILCEGetir"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.debug = true; try { androidHttpTransport.call("http://tempuri.org/ILCEGetir", envelope); SoapObject response = (SoapObject) envelope.getResponse(); ilceList = new String[response.getPropertyCount()]; for(int i=0;i<response.getPropertyCount();i++){ ilceList[i] = response.getPropertyAsString(i).toString().trim(); } } catch (Exception e) { e.printStackTrace(); } return ilceList; } protected void onPostExecute(String[] ilceList){ ilceSpinner = (Spinner) findViewById(R.id.spinner1); ArrayAdapter<String> ilce_adapter = new ArrayAdapter<String>(NormalAnasayfa.this,android.R.layout.simple_spinner_item, ilceList); ilce_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); ilceSpinner.setAdapter(ilce_adapter); kontrol=true; } }
Segunda tarea
public class semtDoldur extends AsyncTask<String,String[],String[]>{ @Override protected String[] doInBackground(String... ParamIlce) { PropertyInfo ilce = new PropertyInfo(); ilce.name= "ilce"; ilce.setValue(ParamIlce); ilce.type = PropertyInfo.STRING_CLASS; SoapObject request = new SoapObject(NAMESPACE, "SEMTGetir"); request.addProperty(ilce); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=request; envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.debug = true; try { androidHttpTransport.call("http://tempuri.org/SEMTGetir", envelope); SoapObject response = (SoapObject) envelope.getResponse(); semtList = new String[response.getPropertyCount()]; for(int i=0;i<response.getPropertyCount();i++){ semtList[i] = response.getPropertyAsString(i).toString().trim(); } } catch (Exception e) { e.printStackTrace(); } return semtList; } protected void onPostExecute(String[] semtList){ semtSpinner = (Spinner) findViewById(R.id.spinner2); ArrayAdapter<String> semt_adapter = new ArrayAdapter<String>(NormalAnasayfa.this, android.R.layout.simple_spinner_item, semtList); semt_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); semtSpinner.setAdapter(semt_adapter); kontrol=true; } }
onCreate ()
new ilceDoldur().execute(); if(kontrol==true){ kontrol=false; ilceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { secilenIlce = ilceSpinner.getSelectedItem().toString().trim(); new semtDoldur().execute(secilenIlce); } public void onNothingSelected(AdapterView<?> arg0) {} }); }
Editar: Obtengo datos de mi servicio web y poblo spinner1. ¿Donde los datos (spinner1 artículo seleccionado) voy a conseguir? y ¿Dónde me poblar spinner2 ejecutar segunda tarea?
- ¿Se matará el hilo antes de que finalice la actividad en Android?
- ProgressBar no se restablece a "0" al abrir la segunda vez
- Delphi XE5 aplicación Android debe procesar las tareas que consumen mucho tiempo dentro de un hilo?
- ¿Cómo probar mejor el código Looper y Handler de la unidad en Android?
- ¿Es seguro guardar una referencia a un hilo en un singleton?
- Prueba de unidades de Android con ContentProviders
- Handler.post (runnable) no ejecuta siempre el método run en android
- Android VideoView setVideoURI bloquea el subproceso de la interfaz de usuario
¡Encontré solución!
obtener datos del servicio web:
private void ilceDoldur(){ SoapObject request = new SoapObject(NAMESPACE, "ILCEGetir"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.debug = true; try { androidHttpTransport.call("http://tempuri.org/ILCEGetir", envelope); SoapObject response = (SoapObject) envelope.getResponse(); ilceList = new String[response.getPropertyCount()]; for(int i=0;i<response.getPropertyCount();i++){ ilceList[i] = response.getPropertyAsString(i).toString().trim(); } } catch (Exception e) { e.printStackTrace(); } }
mi AsyncTask:
public class ilceDoldur extends AsyncTask<String,String[],String[]>{ @Override protected String[] doInBackground(String... params) { ilceDoldur(); return ilceList; } protected void onPostExecute(String[] ilceList){ ilceSpinner = (Spinner) findViewById(R.id.spinner1); ArrayAdapter<String> ilce_adapter = new ArrayAdapter<String>(NormalAnasayfa.this,android.R.layout.simple_spinner_item, ilceList); ilce_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); ilceSpinner.setAdapter(ilce_adapter); ilceSecildi(); } }
Obtener el elemento seleccionado spinner1 y iniciar el segundo asynctask:
public String ilceSecildi(){ ilceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { secilenIlce = ilceSpinner.getSelectedItem().toString().trim(); new semtDoldurAsync(secilenIlce).execute(); } public void onNothingSelected(AdapterView<?> arg0) {} }); return secilenIlce; }
ejecute la primera tarea en onCreate:
new ilceDoldur().execute();
Por lo que entiendo del problema que está diciendo que tiene múltiples AsyncTasks que controlan el contenido de múltiples Spinners. Haces alguna interacción que hace que Spinner1 sea poblado e inmediatamente hagas otra interacción que debería hacer que Spinner2 se llene, pero el comportamiento observado es que Spinner2 no se puebla hasta que Spinner1 termina la población.
Esto se debe a que el comportamiento predeterminado para AsyncTasks es para todos ellos en un proceso para ejecutar en serie. Si desea que AsyncTasks se ejecuten en paralelo, utilice AsyncTask.executeOnExecutor () y especifique el ejecutor del grupo de subprocesos. Sin embargo, lea atentamente los documentos para AsyncTask, pero el comportamiento de paralelismo predeterminado ha cambiado con el tiempo.
Solo cambia onPostExcecute
protected void onPostExecute(String[] ilceList){ ilceSpinner = (Spinner) findViewById(R.id.spinner1); ArrayAdapter<String> ilce_adapter = new ArrayAdapter<String>(NormalAnasayfa.this,android.R.layout.simple_spinner_item, ilceList); ilce_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); ilceSpinner.setAdapter(ilce_adapter); ilceSecildi(); } }
a
protected void onPostExecute(String[] ilceList){ ilceSpinner = (Spinner) findViewById(R.id.spinner1); ArrayAdapter<String> ilce_adapter = new ArrayAdapter<String>(getApplicationContext(),android.R.layout.simple_spinner_item, ilceList); ilce_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); ilceSpinner.setAdapter(ilce_adapter); ilceSecildi(); } }
- Integración de Adwhirl con Cordova 2.0 en Android
- ¿Por qué no AsyncTasks siempre funcionan dentro de un onClickListener?