【问题标题】:understanding parallel Async Task in android了解android中的并行异步任务
【发布时间】:2016-03-17 12:45:08
【问题描述】:

在我的应用程序中,我在很多地方都使用了异步任务,最近我遇到了以下异步任务的 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() 没有被调用。

【问题讨论】:

标签: android multithreading android-asynctask threadpool


【解决方案1】:

当您多次运行AsyncTask 时,它们都在同一个线程上的队列中运行,因此直到一个任务没有完成,下一个任务才会开始。

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

看看AsyncTask video

【讨论】:

    【解决方案2】:

    嗨,谢谢 Stallion 和 royB 重播……我找到了导致问题的原因……

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

    Donut 之前(直到 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 个线程可以在我的设备中运行,并且由于这些线程已经被占用(运行).. 因为我在 doInbackground() 方法中使用 while 循环,这些 Async 任务永远不会完成,所以新的 AsyncTask 将进入队列并且没有让线程执行。 现在我已经确保异步任务在其工作结束后立即正确终止。在我修复之后,你可以在下面看到异步任务(线程)可用(处于等待状态)来处理新任务......

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多