4

エラーが発生します。何が問題なのかはわかりますが、修正方法がわかりません。

私は4つのスピナーを持っています。すべてのスピナーは1つの非同期タスクに関連していました。簡単に言うと、spinner1で1つのアイテムを選択すると、spinner2に入力する2番目の非同期タスクを実行します(選択したアイテムをパラメーターとして2番目の非同期タスクに追加します)。このように続行します。

ただし、最初の非同期タスクが終了する前に、spinner2にデータを入力することはできません。この場合、エラーが発生します。それを修正する方法は?最初のタスクが終了し、2番目のタスクが機能するようにする方法は?

これがコードです。

最初のタスク

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

2番目のタスク

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にデータを入力する場所で2番目のタスクを実行しますか?

4

3 に答える 3

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で選択したアイテムを取得し、2番目の非同期タスクを開始します。

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();
于 2012-08-09T13:56:39.687 に答える
0

私が問題について理解していることから、あなたは複数のスピナーの内容を制御する複数のAsyncTasksを持っていると言っています。Spinner1にデータを入力するインタラクションを実行し、すぐにSpinner2にデータを入力する別のインタラクションを実行しますが、観察された動作では、Spinner1がデータの入力を完了するまでSpinner2にデータが入力されません。

これは、AsyncTasksのデフォルトの動作が、プロセス内のすべてのタスクがシリアルに実行されるためです。AsyncTasksを並行して実行する場合は、AsyncTask.executeOnExecutor()を使用して、スレッドプールエグゼキューターを指定します。ただし、AsyncTaskのドキュメントを注意深く読んでください。ただし、デフォルトの並列処理の動作は時間の経過とともに変化しています。

于 2012-08-10T21:42:23.660 に答える
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();
        }    
    }
于 2013-05-06T10:31:03.070 に答える