【问题标题】:Android how to implement parallel execution for AsyncTaskAndroid如何实现AsyncTask的并行执行
【发布时间】:2015-03-11 04:09:03
【问题描述】:

我需要允许多个 AsyncTask 同时运行。 这是我的 AsyncTask :

 private void callAPI(String user_id) {
    new AsyncTask<Void, Void, String>() {

            protected String doInBackground(Void... parameters) {



                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("user_id",    user_id));

                return api.post("", params);


            }//end doInBackground


            protected void onPostExecute(String result) {
                Log.i(TAG + "POST() => " + result);


            }//end onPostExecute
        }.execute(); //end AsyncTask
      }

我在running-multiple-asynctasks 看到了答案,但我不知道如何使用它。 如何在我的 AsyncTask 中实现以下代码:

     @TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(AsyncTask asyncTask) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);
}

【问题讨论】:

  • 您面临的问题是什么。只要您的堆内存没有被占用,您就可以运行任意数量的内存。
  • 我的初始 AsyncTask 没有执行
  • 您的代码似乎没问题。您是否尝试过调试或将 logcat 放入 doInbackground 方法。它必须运行。
  • 但是我看到要运行多个 AsyncTask ,你需要使用上面的代码 @TargetApi(Build.VERSION_CODES.HONEYCOMB) ..... - 但我不知道如何将它实现到我的方法

标签: java android api android-activity android-asynctask


【解决方案1】:

从 AsynTask 创建调用并从 MainActivity 同步调用类:

public class ApiCalling extends AsyncTask<String, Void, String>() {

        protected String doInBackground(String... parameters) {

            Log.d("LogTag","starting Async Task:"+parameters[0]);

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("user_id",    user_id));

            return api.post("", params);


        }//end doInBackground


        protected void onPostExecute(String result) {
            Log.i(TAG + "POST() => " + result);


        }//end onPostExecute
    }.execute(); //end AsyncTask

来自您的 MainActivity onCreate():

ApiCalling mObj = new ApiCalling();
mObj.execute("call 1");


 /* if the task inside asyn task if long, then better to get new reference of Async task and execute other task */
ApiCalling mObj = new ApiCalling();
mObj.execute("call 2");

【讨论】:

    【解决方案2】:
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import android.annotation.SuppressLint;
    import android.os.AsyncTask;
    import android.os.Build;
    
    /**
     * An executor for concurrently executing AsyncTask tasks
     * It takes all work for understanding device`s Android version 
     * and executes your AsyncTasks tasks concurrently
     * @author Artem Zinnatullin (artem.zinnatullin@gmail.com)
     * @version 1.2
     */
    public class AsyncTaskExecutor {
    
        private static final int CORE_POOL_SIZE;
        private static final int MAXIMUM_POOL_SIZE;
        private static final int KEEP_ALIVE;
        private static final TimeUnit TIME_UNIT;
    
        private static final BlockingQueue<Runnable> concurrentPoolWorkQueue;
        private static final ThreadFactory concurrentThreadFactory;
        private static final ThreadPoolExecutor concurrentExecutor;
    
        private AsyncTaskExecutor() {}
    
        static {
            CORE_POOL_SIZE    = 5;
            MAXIMUM_POOL_SIZE = 128;
            KEEP_ALIVE        = 1;
            TIME_UNIT         = TimeUnit.SECONDS;
    
            concurrentPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);
            concurrentThreadFactory = new AsyncTaskThreadFactory();
            concurrentExecutor      = new ThreadPoolExecutor(
                    CORE_POOL_SIZE,
                    MAXIMUM_POOL_SIZE,
                    KEEP_ALIVE,
                    TIME_UNIT,
                    concurrentPoolWorkQueue,
                    concurrentThreadFactory
            );
        }
    
        /**
         * Concurrently executes AsyncTask on any Android version
         * @param task to execute
         * @param params for task
         * @return executing AsyncTask 
         */
        @SuppressLint("NewApi") 
        public static <Params, Progress, Result> AsyncTask<Params, Progress, Result> 
            executeConcurrently(AsyncTask<Params, Progress, Result> task, Params... params) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                task.executeOnExecutor(concurrentExecutor, params);
            } else {
                task.execute(params);
            }
    
            return task;
        }
    
        /**
         * Thread factory for AsyncTaskExecutor
         * @author Artem Zinnatullin
         */
        private static class AsyncTaskThreadFactory implements ThreadFactory {
            private final AtomicInteger count = new AtomicInteger(1);;
    
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r, "AsyncTask #" + count.getAndIncrement());
            }
        }
    }
    

    如果您想同时执行 Asynctask,请使用此类。找到了这门课,它对我有用。

    AsyncTaskExecutor.executeConcurrently(new YourAsyncTask(),1);
    

    异步任务

    private class YourAsyncTask extends AsyncTask<Integer, Integer, String> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Toast.makeText(mContext, "Please wait..Fetching Data",
                        Toast.LENGTH_LONG).show();
            }
    
            @Override
            protected String doInBackground(Integer... params) {
                Log.e("passing value",""+params[0]);
                String uri = "http://abcd.com/ServiceTest.php?id="
                        + params[0];
                Log.e("passing value",""+uri);
                return SetServerString;
            }
    
            @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(SetServerString);
    
        }
    

    希望对你有帮助!

    【讨论】:

    • 您好 Rohit,感谢您的回答。但是,当我创建一个新的 Async 时,我如何包含它,即作为我上面的代码? = new AsyncTask() {... - PS 我是 android 新手
    • 如果我理解正确,您是否要向您的异步任务发送参数?
    • 如果没有,那么你可以通过你的 asynctask 并且它会工作
    • 谢谢,我现在就试试。你能解释一下 是什么意思吗?
    • AsyncTaskExecutor.executeConcurrently(new YourAsyncTask(),1st Parmaeter,2nd Parameter and so on);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多