0

2つの非同期タスクが相互に機能しています。私はそれらをレストランメニューの作成に使用しています。最初のWebサービスは、データベースからメニューのタイトルを取得します。2番目のWebサービスは、データベースからタイトルのアイテムを取得します。最初の非同期タスクでタイトルデータを取得し、2番目の非同期タスクでアイテムデータを取得します。

たとえば、10個のメニュータイトルがあります。タイトルごとに8つのアイテムがあります。最初の非同期タスクを実行して、すべてのメニュータイトルを取得します。このタイトルのアイテムを取得してTextViewを追加するために、最初のasynctaskのonPostExecuteで2番目のasynctaskを呼び出したいと思います。アイテムを追加するには、1つおきのタスクが完了するのを待つ必要があります。

つまり、最初にAsyncTaskを呼び出して、終了するのを待つ必要があります。次に、FirstAsyncTaskの2番目のAsyncTaskにリクエストを送信します。私はすべての要求が完了するのを待たなければなりません。どうすれば待つことができますか?

これが私のコードです。

最初のAsyncTask

public class BaslikDoldurAS extends AsyncTask<String,String[][],String[][]>{
        int ParamID;

        public BaslikDoldurAS(String ParamID){
            this.ParamID=Integer.parseInt(ParamID);
        }

        @Override
        protected String[][] doInBackground(String... params) {
            BaslikDoldur(ParamID);
            return sonuc;
        }

        protected void onPostExecute(String[][] sonuc){
            for(int i=0;i<baslikCount;i++){ 
                 MenuDoldurAS kontrol = new MenuDoldurAS(firma_id,sonuc[2][i]);
                 kontrol.execute();
            } 
        }
    }

最初のasyncTaskで使用される私の関数

private String[][] BaslikDoldur(Integer ParamID){
        PropertyInfo id = new PropertyInfo();
        id.name= "id";
        id.setValue(ParamID);
        id.type = PropertyInfo.INTEGER_CLASS;

        SoapObject request = new SoapObject(NAMESPACE, "BaslikDoldur");
        request.addProperty(id);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut=request;
        envelope.dotNet = true;     
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(MenuURL);
        androidHttpTransport.debug = true;

        try {

            androidHttpTransport.call("http://tempuri.org/BaslikDoldur", envelope);
            SoapObject response = (SoapObject) envelope.getResponse();

            sonuc[2]=new String[response.getPropertyCount()]; //baslik
            baslikCount=response.getPropertyCount();

            for(int i=0;i<response.getPropertyCount();i++){    
                   Object property = response.getProperty(i);
                   if(property instanceof SoapObject){
                       SoapObject menu = (SoapObject) property;
                       sonuc[2][i] = menu.getProperty("menu_baslik").toString();
                   }
            }
     } 
             catch (Exception e) {          
                e.printStackTrace();
            }
        return sonuc;

    }

2番目のAsyncTask

public class MenuDoldurAS extends AsyncTask<String,String[][],String[][]>{
        int ParamID;
        String Baslik;

        public MenuDoldurAS(String ParamID,String Baslik){
            this.ParamID=Integer.parseInt(ParamID);
            this.Baslik=Baslik;
        }
        @Override
        protected String[][] doInBackground(String... params) {
            MenuDoldur(ParamID,Baslik);
            return sonuc;
        }

        protected void onPostExecute(String[][] sonuc){
            for(int i=0;i<count;i++){
                String baslik="";
                if(!baslik.equals(sonuc[2][i])){
                    baslik=sonuc[2][i];
                    TextView basliktxt = new TextView(Urun.this);
                    basliktxt.setText(sonuc[2][i]);
                    basliktxt.setTextSize(20);
                    basliktxt.setTextColor(Color.RED);
                    basliktxt.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
                    urunLayout.addView(basliktxt);
                }
                else{
                    TextView aciklamatxt = new TextView(Urun.this);
                    aciklamatxt.setText(sonuc[3][i]);
                    aciklamatxt.setTextColor(Color.parseColor("#0c0c7c"));
                    aciklamatxt.setTextSize(17);
                    aciklamatxt.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
                    urunLayout.addView(aciklamatxt);
                }
            }   
        }

    }

2番目のasyncTaskで使用される私の関数

private String[][] MenuDoldur(Integer ParamID,String Baslik){
        PropertyInfo id = new PropertyInfo();
        id.name= "id";
        id.setValue(ParamID);
        id.type = PropertyInfo.INTEGER_CLASS;

        PropertyInfo baslik = new PropertyInfo();
        baslik.name= "baslik";
        baslik.setValue(Baslik);
        baslik.type = PropertyInfo.STRING_CLASS;

        SoapObject request = new SoapObject(NAMESPACE, "MenuDoldur");
        request.addProperty(id);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut=request;
        envelope.dotNet = true;     
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(MenuURL);
        androidHttpTransport.debug = true;

        try {

            androidHttpTransport.call("http://tempuri.org/MenuDoldur", envelope);
            SoapObject response = (SoapObject) envelope.getResponse();

            sonuc[3]=new String[response.getPropertyCount()]; //aciklama ve fiyat
            count = response.getPropertyCount();

            for(int i=0;i<response.getPropertyCount();i++){    
                   Object property = response.getProperty(i);
                   if(property instanceof SoapObject){
                       SoapObject menu = (SoapObject) property;
                       sonuc[3][i] = menu.getProperty("menu_aciklama").toString() + " - " + menu.getProperty("menu_fiyat").toString();
                   }
            }
     } 
             catch (Exception e) {          
                e.printStackTrace();
            }
        return sonuc;   

    }
4

1 に答える 1

2

すべてのAsyncTasksが完了するまで待ってから先に進む場合は、最初のAsyncTaskのdoInBackgroundにすべての作業を入れてみませんか?

または、10個の「2番目のタスク」を並行して実行したいので、これを実行したくないですか?(ちなみに、タスクにTHREAD_POOL Executorを使用していないため、とにかく実行していません。)この場合は、次のようなことを実行してください。

// variable accessible to both tasks
ArrayList<AsyncTask> mRunningTasks = new ArrayList<AsyncTask>();
// AsyncTask1
protected void onPostExecute(String[][] sonuc){
    for(int i=0;i<baslikCount;i++){ 
         MenuDoldurAS kontrol = new MenuDoldurAS(firma_id,sonuc[2][i]);
         mRunningTasks.add(kontrol);
    }
    for (AsyncTask task : mRunningTasks) {
        task.execute();
    }
}

// AsyncTask2
protected void onPostExecute(...) {
    boolean allComplete = true;
    for (AsyncTask task : mRunningTasks) {
      if (!task.getStatus().equals(AsyncTask.Status.FINISHED)) {
          allComplete = false;
          break;
      }
    }
    if (allComplete) {
       //do whatever
       mRunningTasks.clear();
    }
}
于 2012-08-10T22:33:20.337 に答える