了解 android 中的并行异步任务

understanding parallel Async Task in android

在我的应用程序中,我在很多地方都使用了异步任务,最近我遇到了以下异步任务的 doInBackground 没有被调用的问题,这是在我第三次执行以下异步任务时发生的(其他异步任务也是 运行).

protected class StatusTask extends AsyncTask<Void, Void, Void> {
    private final BluetoothDevice device;

    public StatusTask(BluetoothDevice device) {
        this.device = device;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        while (true) {
            if (someCondition) {
                Log.D(TAG,"hi hello")
                break;
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                //e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        tTask=null;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        System.out.println("onCancelled " + this.isCancelled());
    }

    @Override
    protected void onCancelled(Void aVoid) {
        super.onCancelled(aVoid);
        System.out.println("onCancelled result " + this.isCancelled());
    }
}

我正在执行上述任务,

 StatusTask  tTask = new StatusTask(device);   
 tTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

我 运行 使用 Android 版本 4.4.3。

  1. 如何查看我的应用程序中当前 运行 有多少个同步任务? Bcz 我猜 CORE_POOL_SIZE 计数可能导致问题。

  2. 或者如果发生死锁或任何其他情况并阻止执行新的异步任务,android studio 中是否有办法识别并终止其他可能无法执行的异步任务有用吗?

  3. 如果我使用 CustomThreadPoolExecutor 作为 disconnectTask.executeOnExecutor(mCustomThreadPoolExecutor);有更多的 CorePoolSize 它工作正常但是下一个使用 AsyncTask.THREAD_POOL_EXECUTOR 的异步任务的 doInBackground() 没有被调用。

当你运行宁AsyncTask多次,他们都运行在同一个线程的队列中,因此直到1个任务没有完成,下一个不会开始。

因为您永远不会完成任务...下一个任务将不会开始

看看AsyncTask video

您好,感谢 Stallion 和 royB 的重播....我找到了导致问题的原因...

多个异步任务的条件如下,

甜甜圈之前(直到 1.6 版本)

There was no concept of Multiple AsyncTask.

在 Donut 之后直到 Honeycomb (1.6 – 3.0)

Here it uses multiple AsyncTask in parallel by default and you cannot customize it.

Honeycomb 之后直到 Jelly Bean(版本 3.0 – 4.3.1)

private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);

来自 KitKat(4.4 以上):

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128);

因为我 运行 正在使用 Android 版本:4.4.3,所以我使用了 Runtime.getRuntime().availableProcessors();在我的日志中打印 CPU_COUNT 它显示 2 所以 2+1=3 是我设备的 CORE_POOL_SIZE, 正如我从下面的工作室调试器控制台中看到的那样,

同时只有 3 个线程可以 运行 在我的设备中并且因为这些线程已经被占用(运行ning)..因为我在 doInbackground() 方法中使用 while 循环,那些异步任务永远不会完成,所以新的 AsyncTask 将进入队列并且不会让线程执行。 现在我已经确保 Async Task 在其工作结束后立即正确终止。在我修复之后,您可以在下面看到异步任务(线程)可用(处于等待状态)来处理新任务...