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.

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?

¡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(); } } 
  • ¿Por qué estoy recibiendo: threadid = 3: reaccionar a la señal 3 y congelación de juego (AndEngine)?
  • Dibujo de lienzo SurfaceView de Android con un hilo
  • Cómo detener el hilo de ASyncTask en android
  • Android Surfaceview Hilos y fugas de memoria
  • Android cómo ejecutarOnUiThread en otra clase?
  • Android - Suspendiendo todos los subprocesos tomó: * ms
  • ¿Por qué se ejecuta AsyncTask en el subproceso principal de una aplicación?
  • Hilos y uso de tareas Asynctask para httppost
  • ¿Están encadenando AsyncTasks consideradas malas prácticas?
  • Quiero crear thread temporizador para Android con Xamarin
  • Glide assert: java.lang.IllegalArgumentException: Debe llamar a este método en el hilo principal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.