2017-08-24 7 views
0

後のループは私が1より多くの価値を持っているので、私は値ごとに実行するためのforループを作るために計画されたループを続行するために作る方法。問題は、AsyncTaskがまだ終了していない場合でも、forループがループしているか継続していることです。アンドロイド:AsyncTaskはフィニッシュ(onPostExecute)

AsyncTaskクラス

public class Server extends AsyncTask<JSONObject, Void, Void> { 

    @Override 
    protected Void doInBackground(JSONObject... params) { 
     ......... 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     ......... 
    } 
} 

活動

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 

    for(int i=0; i<10; i++){ 
     Server myServer = new Server(); 
     myServer.execute(i); 
    } 
} 
+2

Asynctaskは非同期です...ループは待機しません –

答えて

1

@ cricket_007がコメントしたように、ループはAsyncTaskが非同期であるとして待機しませんので、ループはAsyncTaskを待たずに続け終わる。あなたの目的を理解しているので、あなたはこのようなことをする必要があります。

あなたは、このようなインターフェイスを定義する必要があります。

public interface ResponseListener { 
    void responseReceiver(); 
} 

今、あなたはこのような何かをする必要があなたの活動から今すぐあなたのAsyncTask

このような
public class Server extends AsyncTask<JSONObject, Void, Void> { 

    public ResponseListener responseListener; 

    @Override 
    protected Void doInBackground(JSONObject... params) { 
     // ......... 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // ......... Other code 
     // Now here's the callback function to the main activity. 
     responseListener.responseReceiver(); 
    } 
} 

を変更します。

public class YourActivity extends Activity implements HttpResponseListener { 
    public int count = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_a); 

     Server myServer = new Server(); 
     myServer.responseListener = this; 
     myServer.execute(i); 
    } 

    // Callback method implementation 
    @Override 
    public void responseReceiver() { 
     // This is the callback function and it gets called when one AsyncTask finishes. 
     // Increase the count here and keep track of how many times the AsyncTask has been executed. 

     // Do something 
     count++; 

     // Now call the next AsyncTask again if the count haven't reach 10 already 
     if(count <= 10) { 
      Server myServer = new Server(); 
      myServer.responseListener = this; 
      myServer.execute(i); 
     } 
    } 
} 

希望します。

1

私のソリューションは、ロングショットのビットですが、私が思う仕事をしていません。

static Boolean ASYNC_TASK_FINISHED;  
for(int i=0; i<10; i++){ 
    ASYNC_TASK_FINISHED = false; 
    Server myServer = new Server(); 
    myServer.execute(i); 

    while(!ASYNC_TASK_FINISHED){ } 
} 

次に、あなたのAsyncTask

@Override 
protected void onPostExecute(Void result) { 
    ... 

    ASYNC_TASK_FINISHED = true; 
} 

にあなたがActivityAsyncTaskの両方からアクセスASYNC_TASK_FINISHEDグローバルシングルトン変数1つのthatsのを確認する必要があります。

関連する問題