2016-05-18 3 views
0

私は2つのAsyncTaskを持っています。最初はhttpリクエスト#1であり、もう1つは別のリクエストです。私は次のように電話してみたい:Queue AsyncTask Android

new AsyncCallerTickets().execute(); 
new AsyncCallerContacts().execute(); 

それは可能ですか?

マイタスクは以下のとおりです。

private class AsyncCallerTickets extends AsyncTask<Void, Void, Void> 
{ 
    SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     dialog.setCancelable(false); 
     dialog.setMessage(getString(R.string.dialog_wait)); 
     dialog.show(); 

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

     responseStringTickets = mRequestTickets(urlTickets); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dialog.dismiss(); 

       } 

} 

private class AsyncCallerContacts extends AsyncTask<Void, Void, Void> 
{ 
    SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     dialog.setCancelable(false); 
     dialog.setMessage(getString(R.string.dialog_wait)); 
     dialog.show(); 

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

     responseStringTickets = mRequestTickets(urlContacts); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dialog.dismiss(); 

       } 

} 

誰かが私が行うことができますどのように私に説明できますか? ありがとうございます。

+0

たとえば、回避策としてタイマーを使用できますか? @ R.Kirill – Jigen

+1

最初のタスクの 'onPostExecute()'メソッドで2番目のタスクを開始するのはなぜですか? AsyncTaskの詳細については、この[post](http://stackoverflow.com/questions/4068984/running-multiple-asynctask-at-theame-time-not-possible) – x0r

+0

@ R.Kirillで読んでみてください私はあなたの答えを読んで、それは働いている、あなたのおかげで – Jigen

答えて

1

使用ExecutorService、代わりrがあなたの実行可能であるAsyncTask

ExecutorService schTaskEx = Executors.newFixedThreadPool(1); 
schTaskEx.execute(r); 
//more runnable : schTaskEx.execute(r1); 
//more runnable : schTaskEx.execute(r2); 
//etc 

Runnable

Runnable r = new Runnable() { 
      public void run() { 
       //your code in backgroud thread is here 
      } 
     }; 
+0

私は試してみます、 – Jigen

+0

@Jigen 'AsyncTask'の代わりに' Thread'と 'Runnable'を使うことをお勧めします。 – Vyacheslav

+0

しかし、このソリューションの利点は何ですか?ありがとう – Jigen

0

第1のAsyncTaskのonPostExecute()で第2のAsyncTaskを実行してみてください!

1


あなたは最初の非同期タスクのonPostExecuteに呼び出されるコールバックメソッドに2番目のを開始することで次々に呼び出して試すことができます。以下
完全スケッチソリューション:

public CustomActivity extends Activity{ 

    @Override 
    void onCreate(Bundle saveInstance){ 
     super.onCreate(saveInstance); 
     new AsyncCallerTickers(mCallback1).execute(); 
    } 

    public Callback mCallback1 = new Callback{ 
     @Override 
     public void onSuccess(){ 
      new AsyncCallerContacts().execute(); 
     } 

     @Override 
     public void onFail(){ 

     } 
    } 

    public interface Callback { 
     void onSuccess(); 
     void onFail(); 
    } 

}

// asynctaskクラス

public class AsyncCallerTickets extends AsyncTask<Void, Void, Void> { 

    SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom); 
     private CustomActivity.Callback callback; 
     public AsyncCallerTickets(CustomActivity.Callback _callback){ 
      this.callback = _callback; 
     } 

     @Override 
     protected void onPreExecute() { 
     super.onPreExecute(); 

     dialog.setCancelable(false); 
     dialog.setMessage(getString(R.string.dialog_wait)); 
     dialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      responseStringTickets = mRequestTickets(urlTickets); 
      return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      dialog.dismiss(); 
      if(result!=null){ 
       callback.onSucces(); 
      } 
      else{ 
       callback.onFail(); 
      } 
    } 
} 

public class AsyncCallerContacts extends AsyncTask<Void, Void, Void> { 
    SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     dialog.setCancelable(false); 
     dialog.setMessage(getString(R.string.dialog_wait)); 
     dialog.show(); 
    } 

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

     responseStringTickets = mRequestTickets(urlContacts); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dialog.dismiss();    
    } 

}一般的に


私はと別々のクラスでそれらを持っているのが好きいくつかのコールバックが添付され、私がタスクIを開始するUiでコールバックを入れて、非同期タスクが成功して戻ったら、私は2番目のタスクを開始します。単純にする。