1

Androidで次のようなものを実装したい:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    //Code to wait for myAsyncTask to finish


}

問題は、新しい反復を開始する前に myAsyncTask が終了するのをどのように待つことができるかです。私が考えた解決策の 1 つは、内部に Handler を配置して数秒間待機することです。例えば:

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 

    } 
}, 5000); 

しかし、myAsyncTask を待機する標準時間を設定する必要があるため、これは機能していても正しくありません。また、 a,b.. パラメータは反復ごとに変化するため、 myAsyncTask が早く終了するか遅く終了するかはわかりません。

私が考えた別の解決策は、ループのたびにオブジェクト aTask に問い合わせて、myAsyncTask のステータスを取得し、それが FINISHED かどうかを確認することです。例えば:

while(!aTask.getStatus().equalsTo(AsyncTask.Status.FINISHED)){

}

しかし、myAsyncTask は常に RUNNING であるため、これは機能しません。

誰か助けてくれませんか?

4

4 に答える 4

1
 //Code to wait for myAsyncTask to finish

そこで待つと、UI がフリーズします。あなたが待つつもりなら、別のスレッドのポイントは何ですか?

私の推測では、execute(Params...)メソッドでオプションのパラメーターを使用する必要があります。「a」、「b」、またはそれらのオブジェクトが何であれ、配置することができ、配置する数は重要ではありません。これにより、タスクがそれらすべてを実行し、より適切に制御できるようになります。

protected Long doInBackground(Objects... objs){
    for(int i = 1; i < objs.length; i++){
       // Do Work
    }
}
于 2013-09-12T17:54:12.677 に答える
0

easiest方法は、呼び出す場所からメソッドを作成し、そのasynTask.execute()メソッドをから呼び出すことonPostExecute()です。

public class ParentClass extends Activity
{

   int asyncCalls = 0;
   ......


    public void callAsyncTaskAgain()
    {
      aTask = new myAsyncTask(a,b..);
      aTask.execute();

      asyncCalls++;
    }


    public class AnotherClass extends AsyncTask
    {

         protected Void onPostExecute(Void result)
         {
            ....

            if(asyncCalls < SOME_NUMBER)
                  callAsyncTaskAgain();
    }
}

}

お役に立てれば

于 2013-09-12T18:22:13.800 に答える
0

Android では、UI スレッドにとどまって何かを待ってはいけません。これには、バックグラウンドで実行される AsyncTasks の待機が含まれます。呼び出し元のスレッドで待機すると、ユーザーがブロックされ、デバイスがフリーズします。

コードを 2 つの部分に分ける必要があります。

最初にAsyncTasks を起動します。

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    // dont wait here. It would freeze the UI Thread
}

Task が終了したときに 2 番目のコードを実行すると、 のonPostExecute()メソッドが上書きされMyAsyncTaskます。

その後、Android は AsyncTasks の実行中にその作業を行うことができます。

于 2013-09-12T17:50:59.820 に答える
0

forループが実際に何をしているかに応じて、ループを使用して処理したいアイテムの「キュー」を作成するという簡単な提案があります。次に、キュー内の最初のオブジェクトで asynctask を起動し、そのタスクが完了すると、キューの長さがゼロになるまでキュー内の次のオブジェクトを起動します

于 2013-09-12T17:51:31.883 に答える