AsyncTask是否同时工作?

时间:2017-11-24 04:28:18

标签: java android android-asynctask httpresponse android-webservice

AsyncTask 是同时还是以先到先得的方式运作? 。

例如,我有3个具有相同接口类和相同侦听器功能的AsyncTasks。同时执行3个AsyncTasks。 AsyncTasks的哪些响应将在 listener 函数中显示?

疑惑:

1。 AsyncTasks是以并行还是先到先得的方式运行的?  2.如果AsyncTasks以并行方式运行,则如何处理同一个侦听器     所有AsyncTasks的功能?

Nb :怀疑2是因为在不使用AsyncTask的情况下同时执行多个请求时收到第一个响应。 ( Web Api响应)。

提前致谢。

2 个答案:

答案 0 :(得分:3)

对于多个请求,您可以使用ThreadPoolExecutor

public class MultipleAsyncTask extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        runMultipleAsyncTask(); // Start Async Task
    }
    private void runMultipleAsyncTask() // Run Multiple Async Task
    {
        FirstAsyncTask asyncTask = new FirstAsyncTask(); // First
        if(AppUtil.isCurrentVersionHoneycombAndAbove()) // Above Api Level 13
        {
            asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
        else // Below Api Level 13
        {
            asyncTask.execute();
        }
        SecondAsyncTask asyncTask2 = new SecondAsyncTask(); // Second
        if(AppUtil.isCurrentVersionHoneycombAndAbove())// Above Api Level 13
        {
            asyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
        else // Below Api Level 13
        {
            asyncTask2.execute();
        }
    }
    //Start First Async Task:
    private class FirstAsyncTask extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected void onPreExecute()
        {
            Log.i("AsyncTask" ,"FirstOnPreExecute()");
        }
        @Override
        protected Void doInBackground(Void... params)
        {
            for(int index = 0; index < 50; index++)
            {
                Log.i("AsyncTask" ,"FirstAsyncTask");
                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException exception)
                {
                    exception.printStackTrace();
                }
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            Log.d("AsyncTask" ,"FirstonPostExecute()");
        }
    }
    //Start Second Async Task:
    private class SecondAsyncTask extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected void onPreExecute()
        {
            Log.i("AsyncTask" ,"SecondOnPreExecute()");
        }
        @Override
        protected Void doInBackground(Void... params)
        {
            for(int index = 0; index < 50; index++)
            {
                Log.d("AsyncTask" ,"SecondAsyncTask");
                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException exception)
                {
                    exception.printStackTrace();
                }
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            Log.d("AsyncTask" ,"SecondOnPostExecute()");
        }
    }
}

线程池模式

AsyncTask使用线程池模式来运行doInBackground()

中的东西

线程池模式是创建线程数以执行许多任务的位置。它基本上是一个容器,其中多个线程进入队列以执行不同的任务。

例如:

FirstOnPreExecute()
SecondOnPreExecute()
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstAsyncTask
SecondAsyncTask
FirstonPostExecute()
SecondOnPostExecute()

输出:

boolean flag;
    @Override
    protected String doInBackground (String... params) {
        flag= params[0].endsWith("/repos");
        //other statements
    }

与api请求等不同功能相同的asyncTask:

if(flag){
    //parse one way
} else {
    //parse another way
}

现在在你的onPostExecute:

SELECT s.*,
COUNT(i.shop_id) total_count,
SUM(i.`view`) total_views,
SUM(i.click) total_clicks,
COALESCE(c.group_sum,0) group_sum
FROM shops s
JOIN items i ON i.shop_id = s.id
LEFT JOIN   (
    SELECT a.shop_id,SUM(a.count) group_sum
    FROM (
           SELECT shop_id,cat_id,MAX(id),SUM(`view`) AS `count`
           FROM items           
           GROUP BY shop_id,cat_id
   ) a
) c ON  s.id = c.shop_id
GROUP BY  s.id

答案 1 :(得分:3)

我同意Hemant Parmar给出的答案,但还有一些事情需要知道每个 AsyncTask onPreExecute()以先到先得的方式执行每个AsyncTask的 doInBackground()方法同时运行。

所以如果你正在执行

new FirstAsyncTask().execute();

new SecondAsyncTask().execute();

然后,FirstAsyncTask()的 onPreExecute()将完成其执行,并将启动将在后台执行的FirstAsyncTask()的 doInBackground(),现在 SecondAsyncTask()将执行其 onPreExecute ,完成后它也将执行SecondAsyncTask()的 doInBackground()。现在,fisrt和第二个异步任务的 doInBackground()将同时运行。