Проблема с несколькими асинхронными задачами на Android Spinner

Я получаю некоторую ошибку. Я знаю, в чем проблема, но я не знаю, как это исправить.

У меня 4 счетчика. Каждый spinner связал одну асинтеску. Короче говоря, когда я выбираю один элемент на spinner1, выполняйте вторую асинтаску, которая заполняет spinner2 (выбранный элемент добавляет вторую асинтезу в качестве параметра). Продолжается таким образом.

Но до конца первой асинтаксы spinner2 не может заполняться. В этом случае я получаю ошибку. Как это исправить? Как сделать, когда первая задача заканчивается, вторая задача работает?

Вот код;

Первая задача

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; } } 

Вторая задача

 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) {} }); } 

Изменить: я получаю данные из своего веб-сервиса и заполняю spinner1. Где я получаю данные (выбранный элемент spinner1)? И где я заполняю spinner2 выполнить вторую задачу?

Я нахожу решение!

Получать данные из веб-службы:

 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(); } } 

Мой 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(); } } 

Получите spinner1 выбранный элемент и начните вторую асинтезу:

 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; } 

Выполнить первую задачу в onCreate:

 new ilceDoldur().execute(); 

Из того, что я понимаю о проблеме, вы говорите, что у вас есть несколько AsyncTasks, которые управляют содержимым нескольких Spinners. Вы выполняете какое-то взаимодействие, которое заставляет Spinner1 заселяться, и немедленно выполняет другое взаимодействие, которое должно заставлять Spinner2 заполняться, но наблюдаемое поведение заключается в том, что Spinner2 не заполняется до тех пор, пока Spinner1 не закончит население.

Это связано с тем, что поведение по умолчанию для AsyncTasks для всех из них в процессе выполняется последовательно. Если вы хотите, чтобы AsyncTasks выполнялась параллельно, используйте AsyncTask.executeOnExecutor () и укажите исполнитель пула потоков. Внимательно прочитайте документы для AsyncTask, но поведение параллелизма по умолчанию со временем изменилось.

Просто измените 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(); } } 

в

  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(); } }