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