java - AsyncTask 是否同时工作?

标签 java android android-asynctask httpresponse android-webservice

AsyncTask 是同时工作还是先到先得? .

例如,我有 3 个具有相同接口(interface)类和相同监听器函数的 AsyncTask。同时执行 3 个 AsyncTasks。 AsyncTasks 的哪个响应将显示在listener 函数中?

疑问:

<强>1。 AsyncTasks 是并行运行还是先到先得? 2.如果AsyncTasks并行运行如何处理同一个监听器 所有 AsyncTasks 的函数?

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

提前致谢。

最佳答案

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    new callApi().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location);
} else {
    new callApi().execute(location);
}

线程池模式

AsyncTask 使用线程池模式来运行 doInBackground() 中的内容

线程池模式是创建多个线程以执行多个任务的地方。它基本上是一个容器,其中多个线程排在队列中以执行不同的任务。

例如:

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

输出:

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

相同的 asyncTask 用于不同的功能,例如 api 请求:

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

现在在你的 onPostExecute 中:

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

关于java - AsyncTask 是否同时工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47466374/

相关文章:

java - 如何衡量 C++ 或 Java 文件的复杂性?

java - Silk Test Open Agent 在测试执行后不会自动停止

java - 将 onResume/onStop 用于首选项(设置)

android - 没有 super() 调用的 AsyncTask 构造函数

android - 你能在一个 Activity 中有两个 AsyncTasks 吗?

java - 在 JFrame 和 WordWrap 上的 x 按钮上添加方法

java - JProfiler 显示 "unknown"JDBC 调用花费了 40% 的时间

java - Android ViewPager 控件未出现在图形布局编辑器中

java - 蓝牙使用简单指南

Java Android AsyncTask + mysql连接