4

我收到一些错误。我知道是什么问题,但我不知道如何解决。Android Spinner上的多个AsyncTasks问题

我有4个微调。每个微调者都涉及一个asynctask。简而言之,当我在spinner1上选择一个项目时,执行第二个填充spinner2的asynctask(选择的项目添加到第二个asynctask作为参数)继续以这种方式。

但是在第一个asynctask结束之前,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) {} 
      }); 
     } 

编辑: 我从我的web服务数据和填充spinner1。哪里可以得到数据(spinner1选择的项目)?和我在哪里填充spinner2执行第二个任务?

+0

什么是你得到的错误?请添加您的Logcat – thepoosh 2012-08-09 07:28:57

+0

我宁愿调用该错误,但它不是错误。第二个微调不填充。我在spinner1上选择一个项目,但spinner2不填充。 – 2012-08-09 07:35:49

+0

是从网络服务中下载的数据吗? – 2012-08-09 09:43:10

回答

0

我找到解决方案!从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(); 
     }  
    } 

我的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选择的项目,并开始第二的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; 
    } 

执行中的onCreate第一个任务:

new ilceDoldur().execute(); 
0

根据我所了解的问题,您说您有多个控制多个Spinners内容的AsyncTasks。你做了一些交互,导致Spinner1被填充,并立即做另一个交互,应该导致Spinner2被填充,但观察到的行为是Spinner2不会填充,直到Spinner1完成填充。

这是因为AsyncTasks的默认行为是为了让一个进程中的所有进程顺序执行。如果您希望AsyncTasks并行运行,请使用AsyncTask.executeOnExecutor()并指定线程池执行程序。小心阅读AsyncTask的文档,但默认的并行性行为随着时间的推移而改变。

+0

我找到解决这个问题的解决方案,但感谢您的关注。我有新的问题asynctask请按照http://stackoverflow.com/questions/11909594/multiple-and-repetitive-asynctask-in-android – 2012-08-10 21:47:02

0

只要改变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(); 
     }  
    }