Android calling AsyncTask right after an another finished

后端 未结 7 2185
萌比男神i
萌比男神i 2020-11-28 06:15

I have some problem with Android AsyncTask. There is an Activity which contains some TextView a button and a picture. When an user entered this activity I start an asynctask

7条回答
  •  粉色の甜心
    2020-11-28 06:25

    1:

    You could write the code for authTask and then for imageTask, one after the other, within a single doInBackground(). This single AsyncTask instance would be fire by a single execute() statement. This may or may not be practical depending on needed UI interactions.


    2:

    Edit: as noted by kabuku this information is mostly for HoneyComb+. Pre HoneyComb I would definitely go with option 1 above. executeOnExecutor() is api level 11+

    In receent versions, execute() will send your AsyncTasks in series by default (ICS+). If you want to make sure this happens, specify the serial executor.

    In your case this would be:

    authTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
    // Image task will only be done AFTER textViewTask is done
    imageTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
    

    And for newer versions a simple

    ...
    // ICS+ and pre honeycomb (I think)
    authTask.execute();
    // Image task will only be done AFTER textViewTask is done
    imageTask.execute();
    ...
    

    From the AsycnTask.execute() documentation:

    Note: this function schedules the task on a queue for a single background thread or pool of threads depending on the platform version. When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. After HONEYCOMB, it is planned to change this back to a single thread to avoid common application errors caused by parallel execution.


    PS: To run tasks independent of each other you must use the AsyncTask.THREAD_POOL_EXECUTOR. That requires a different executor:

    // Go parallel! (NOT what you want)
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    

提交回复
热议问题