Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9252097
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 18, 20262026-06-18T10:51:37+00:00 2026-06-18T10:51:37+00:00

As I noticed, in Android 3.0 and higher, all AsyncTasks are pushed in the

  • 0

As I noticed, in Android 3.0 and higher, all AsyncTasks are pushed in the stack and are executed in order, however in earlier versions they are executed independently. Can I somehow apply same style on Android <3.0 as in >=3.0?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-18T10:51:38+00:00Added an answer on June 18, 2026 at 10:51 am

    I did not test this, but this class should be used instead of the default AsyncTask and it should work on any API with a single working thread.

    package com.shush.util.comm;
    
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.TimeoutException;
    import java.util.concurrent.CancellationException;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import android.os.Handler;
    import android.os.Message;
    
    
    public abstract class MyAsyncTask<Params, Progress, Result> {
        private static final String LOG_TAG = "AsyncTask";
    
        private static final int CORE_POOL_SIZE = 1;
        private static final int MAXIMUM_POOL_SIZE = 1;
        private static final int KEEP_ALIVE = 10;
    
        private static final BlockingQueue<Runnable> sWorkQueue =
                new LinkedBlockingQueue<Runnable>(10);
    
        private static final ThreadFactory sThreadFactory = new ThreadFactory() {
            private final AtomicInteger mCount = new AtomicInteger(1);
    
            public Thread newThread(Runnable r) {
                return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
            }
        };
    
        private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
                MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
    
        private static final int MESSAGE_POST_RESULT = 0x1;
        private static final int MESSAGE_POST_PROGRESS = 0x2;
        private static final int MESSAGE_POST_CANCEL = 0x3;
    
        private static final InternalHandler sHandler = new InternalHandler();
    
        private final WorkerRunnable<Params, Result> mWorker;
        private final FutureTask<Result> mFuture;
    
        private volatile Status mStatus = Status.PENDING;
    
        /**
         * Indicates the current status of the task. Each status will be set only once
         * during the lifetime of a task.
         */
        public enum Status {
            /**
             * Indicates that the task has not been executed yet.
             */
            PENDING,
            /**
             * Indicates that the task is running.
             */
            RUNNING,
            /**
             * Indicates that {@link AsyncTask#onPostExecute} has finished.
             */
            FINISHED,
        }
    
        /**
         * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
         */
        public MyAsyncTask() {
            mWorker = new WorkerRunnable<Params, Result>() {
                public Result call() throws Exception {
    //                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                    return doInBackground(mParams);
                }
            };
    
            mFuture = new FutureTask<Result>(mWorker) {
                @Override
                protected void done() {
                    Message message;
                    Result result = null;
    
                    try {
                        result = get();
                    } catch (InterruptedException e) {
                        android.util.Log.w(LOG_TAG, e);
                    } catch (ExecutionException e) {
                        throw new RuntimeException("An error occured while executing doInBackground()",
                                e.getCause());
                    } catch (CancellationException e) {
                        message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
                                new AsyncTaskResult<Result>(MyAsyncTask.this, (Result[]) null));
                        message.sendToTarget();
                        return;
                    } catch (Throwable t) {
                        throw new RuntimeException("An error occured while executing "
                                + "doInBackground()", t);
                    }
    
                    message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                            new AsyncTaskResult<Result>(MyAsyncTask.this, result));
                    message.sendToTarget();
                }
            };
        }
    
        /**
         * Returns the current status of this task.
         *
         * @return The current status.
         */
        public final Status getStatus() {
            return mStatus;
        }
    
        /**
         * Override this method to perform a computation on a background thread. The
         * specified parameters are the parameters passed to {@link #execute}
         * by the caller of this task.
         *
         * This method can call {@link #publishProgress} to publish updates
         * on the UI thread.
         *
         * @param params The parameters of the task.
         *
         * @return A result, defined by the subclass of this task.
         *
         * @see #onPreExecute()
         * @see #onPostExecute
         * @see #publishProgress
         */
        protected abstract Result doInBackground(Params... params);
    
        /**
         * Runs on the UI thread before {@link #doInBackground}.
         *
         * @see #onPostExecute
         * @see #doInBackground
         */
        protected void onPreExecute() {
        }
    
        /**
         * Runs on the UI thread after {@link #doInBackground}. The
         * specified result is the value returned by {@link #doInBackground}
         * or null if the task was cancelled or an exception occured.
         *
         * @param result The result of the operation computed by {@link #doInBackground}.
         *
         * @see #onPreExecute
         * @see #doInBackground
         */
        @SuppressWarnings({"UnusedDeclaration"})
        protected void onPostExecute(Result result) {
        }
    
        /**
         * Runs on the UI thread after {@link #publishProgress} is invoked.
         * The specified values are the values passed to {@link #publishProgress}.
         *
         * @param values The values indicating progress.
         *
         * @see #publishProgress
         * @see #doInBackground
         */
        @SuppressWarnings({"UnusedDeclaration"})
        protected void onProgressUpdate(Progress... values) {
        }
    
        /**
         * Runs on the UI thread after {@link #cancel(boolean)} is invoked.
         *
         * @see #cancel(boolean)
         * @see #isCancelled()
         */
        protected void onCancelled() {
        }
    
        /**
         * Returns <tt>true</tt> if this task was cancelled before it completed
         * normally.
         *
         * @return <tt>true</tt> if task was cancelled before it completed
         *
         * @see #cancel(boolean)
         */
        public final boolean isCancelled() {
            return mFuture.isCancelled();
        }
    
        /**
         * Attempts to cancel execution of this task.  This attempt will
         * fail if the task has already completed, already been cancelled,
         * or could not be cancelled for some other reason. If successful,
         * and this task has not started when <tt>cancel</tt> is called,
         * this task should never run.  If the task has already started,
         * then the <tt>mayInterruptIfRunning</tt> parameter determines
         * whether the thread executing this task should be interrupted in
         * an attempt to stop the task.
         *
         * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
         *        task should be interrupted; otherwise, in-progress tasks are allowed
         *        to complete.
         *
         * @return <tt>false</tt> if the task could not be cancelled,
         *         typically because it has already completed normally;
         *         <tt>true</tt> otherwise
         *
         * @see #isCancelled()
         * @see #onCancelled()
         */
        public final boolean cancel(boolean mayInterruptIfRunning) {
            return mFuture.cancel(mayInterruptIfRunning);
        }
    
        /**
         * Waits if necessary for the computation to complete, and then
         * retrieves its result.
         *
         * @return The computed result.
         *
         * @throws CancellationException If the computation was cancelled.
         * @throws ExecutionException If the computation threw an exception.
         * @throws InterruptedException If the current thread was interrupted
         *         while waiting.
         */
        public final Result get() throws InterruptedException, ExecutionException {
            return mFuture.get();
        }
    
        /**
         * Waits if necessary for at most the given time for the computation
         * to complete, and then retrieves its result.
         *
         * @param timeout Time to wait before cancelling the operation.
         * @param unit The time unit for the timeout.
         *
         * @return The computed result.
         *
         * @throws CancellationException If the computation was cancelled.
         * @throws ExecutionException If the computation threw an exception.
         * @throws InterruptedException If the current thread was interrupted
         *         while waiting.
         * @throws TimeoutException If the wait timed out.
         */
        public final Result get(long timeout, TimeUnit unit) throws InterruptedException,
                ExecutionException, TimeoutException {
            return mFuture.get(timeout, unit);
        }
    
        /**
         * Executes the task with the specified parameters. The task returns
         * itself (this) so that the caller can keep a reference to it.
         *
         * This method must be invoked on the UI thread.
         *
         * @param params The parameters of the task.
         *
         * @return This instance of AsyncTask.
         *
         * @throws IllegalStateException If {@link #getStatus()} returns either
         *         {@link AsyncTask.Status#RUNNING} or {@link AsyncTask.Status#FINISHED}.
         */
        public final MyAsyncTask<Params, Progress, Result> execute(Params... params) {
            if (mStatus != Status.PENDING) {
                switch (mStatus) {
                    case RUNNING:
                        throw new IllegalStateException("Cannot execute task:"
                                + " the task is already running.");
                    case FINISHED:
                        throw new IllegalStateException("Cannot execute task:"
                                + " the task has already been executed "
                                + "(a task can be executed only once)");
                }
            }
    
            mStatus = Status.RUNNING;
    
            onPreExecute();
    
            mWorker.mParams = params;
            sExecutor.execute(mFuture);
    
            return this;
        }
    
        /**
         * This method can be invoked from {@link #doInBackground} to
         * publish updates on the UI thread while the background computation is
         * still running. Each call to this method will trigger the execution of
         * {@link #onProgressUpdate} on the UI thread.
         *
         * @param values The progress values to update the UI with.
         *
         * @see #onProgressUpdate
         * @see #doInBackground
         */
        protected final void publishProgress(Progress... values) {
            sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
                    new AsyncTaskResult<Progress>(this, values)).sendToTarget();
        }
    
        private void finish(Result result) {
            if (isCancelled()) result = null;
            onPostExecute(result);
            mStatus = Status.FINISHED;
        }
    
        private static class InternalHandler extends Handler {
            @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
            @Override
            public void handleMessage(Message msg) {
                AsyncTaskResult result = (AsyncTaskResult) msg.obj;
                switch (msg.what) {
                    case MESSAGE_POST_RESULT:
                        // There is only one result
                        result.mTask.finish(result.mData[0]);
                        break;
                    case MESSAGE_POST_PROGRESS:
                        result.mTask.onProgressUpdate(result.mData);
                        break;
                    case MESSAGE_POST_CANCEL:
                        result.mTask.onCancelled();
                        break;
                }
            }
        }
    
        private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
            Params[] mParams;
        }
    
        @SuppressWarnings({"RawUseOfParameterizedType"})
        private static class AsyncTaskResult<Data> {
            final MyAsyncTask mTask;
            final Data[] mData;
    
            AsyncTaskResult(MyAsyncTask task, Data... data) {
                mTask = task;
                mData = data;
            }
        }
    }
    

    If you want the opposite behaviour:

    Use this AsyncTask instead of the default task. Use run() function to start it instead of execute

    package mobi.sherif.util;
    
    import android.annotation.SuppressLint;
    import android.os.AsyncTask;
    
    /**
     * @author Sherif elKhatib
     *
     * Helper AsyncTask that will execute on Thread pool regardless of the api level
     */
    public abstract class MyTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
    
        @SuppressLint({ "NewApi", "NewApi" })
        public void run(Params... params) {
            if(android.os.Build.VERSION.SDK_INT<android.os.Build.VERSION_CODES.HONEYCOMB)
                execute(params);
            else
                executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    
        }
    
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I noticed a lot of Android functions have a parameter that you can pass
I am developing a mobile site and have noticed that on android all the
First of all I'm a total noob (as you might noticed) in Android environment.
In Android, i noticed that you can have a fixed view on top of
Ok I have noticed in the android softkeyboard when the user wants to send
I am studying how the android.speech package works and I noticed that most of
I'm building my first Android image, i noticed that compiling a new kernel is
I'm looking into writing simple graphics code in Android and I've noticed some synchronized()
I noticed that IE 9 does not support application cache. How can I use
I'm doing some initial research on smart phone development, and I noticed that Android

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.