队列AsyncTask Android

时间:2016-05-18 07:42:48

标签: android android-asynctask task

我有两个AsyncTask,第一个是http请求#1,另一个是另一个请求。我想一个接一个地打电话:

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();

               }

}

有人能解释我怎么做吗? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用ExecutorServiceRunnable代替AsyncTask

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

其中r是您的可运行。

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

答案 1 :(得分:1)


您可以尝试通过在第一个异步任务的onPostExecute中调用的回调方法中启动第二个来逐个调用。
完整的草图解决方案如下:

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 classes

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

}


一般来说,我喜欢将它们放在单独的类中,并附带一些回调,在Ui中,我开始执行回调的任务,当异步任务返回成功时,我启动第二个。把事情简单化。

答案 2 :(得分:0)

尝试在第一个AsyncTask的onPostExecute()中执行第二个AsyncTask作为解决方法!!