Problem with multiple asynchronous tasks on Android Spinner

I get some error. I know what the problem is, but I do not know how to fix it.

I have 4 counters. Each spinner knitted one asintescu. In short, when I select one element on spinner1, do a second synthesis, which fills spinner2 (the selected element adds a second synthesis as a parameter). Continues this way.

But until the end of the first synthetics, spinner2 cannot fill up. In this case, I get an error. How to fix it? How to do when the first task ends, the second task works?

Here is the code:

First task

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

Second task

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

Edit: I get data from my web service and populate spinner1. Where do I get the data (selected element spinner1)? and where do I fill spinner2 to do the second task?

+4
source share
3 answers

I find a solution!

get data from web service:

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

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

Get spinner1 the selected element and run the second synthesis:

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

complete the first task in onCreate:

 new ilceDoldur().execute(); 
0
source

From what I understand about the problem, you say that you have several AsyncTasks that manage the contents of several Spinners. You are doing some kind of interaction that causes Spinner1 to populate and immediately performs another interaction that should populate Spinner2, but the observed behavior is that Spinner2 does not fill until Spinner1 completes the population.

This is because the default behavior for AsyncTasks for all of them in the process is performed sequentially. If you want AsyncTasks to run in parallel, use AsyncTask.executeOnExecutor () and specify the thread pool executor. Read the docs carefully for AsyncTask, but the default parallelism behavior has changed over time.

0
source

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

to

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

All Articles