了解 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。
如何查看我的应用程序中当前 运行 有多少个同步任务? Bcz 我猜 CORE_POOL_SIZE 计数可能导致问题。
或者如果发生死锁或任何其他情况并阻止执行新的异步任务,android studio 中是否有办法识别并终止其他可能无法执行的异步任务有用吗?
如果我使用 CustomThreadPoolExecutor 作为 disconnectTask.executeOnExecutor(mCustomThreadPoolExecutor);有更多的 CorePoolSize 它工作正常但是下一个使用 AsyncTask.THREAD_POOL_EXECUTOR 的异步任务的 doInBackground() 没有被调用。
当你运行宁AsyncTask
多次,他们都运行在同一个线程的队列中,因此直到1个任务没有完成,下一个不会开始。
因为您永远不会完成任务...下一个任务将不会开始
您好,感谢 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 在其工作结束后立即正确终止。在我修复之后,您可以在下面看到异步任务(线程)可用(处于等待状态)来处理新任务...
在我的应用程序中,我在很多地方都使用了异步任务,最近我遇到了以下异步任务的 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。
如何查看我的应用程序中当前 运行 有多少个同步任务? Bcz 我猜 CORE_POOL_SIZE 计数可能导致问题。
或者如果发生死锁或任何其他情况并阻止执行新的异步任务,android studio 中是否有办法识别并终止其他可能无法执行的异步任务有用吗?
如果我使用 CustomThreadPoolExecutor 作为 disconnectTask.executeOnExecutor(mCustomThreadPoolExecutor);有更多的 CorePoolSize 它工作正常但是下一个使用 AsyncTask.THREAD_POOL_EXECUTOR 的异步任务的 doInBackground() 没有被调用。
当你运行宁AsyncTask
多次,他们都运行在同一个线程的队列中,因此直到1个任务没有完成,下一个不会开始。
因为您永远不会完成任务...下一个任务将不会开始
您好,感谢 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 在其工作结束后立即正确终止。在我修复之后,您可以在下面看到异步任务(线程)可用(处于等待状态)来处理新任务...