在我的应用程序中,我在许多地方使用Async任务,最近我遇到的问题是下面的Async任务的doInBackground没有被调用,这种情况发生在我第三次执行下面的Async任务时(其他异步任务)也正在运行。)
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计数可能导致问题。
或者如果发生死锁或任何其他情况并阻止新的Async任务执行,android studio中是否有一种方法可以识别并杀死其他可能没用的异步任务?
< / LI>如果我使用CustomThreadPoolExecutor作为disconnectTask.executeOnExecutor(mCustomThreadPoolExecutor);使用更多的CorePoolSize工作正常,但是下一个使用AsyncTask.THREAD_POOL_EXECUTOR的Async任务的doInBackground()没有被调用。
答案 0 :(得分:2)
当你多次运行<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<link rel="stylesheet" href="normalize.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style media="screen">
body {
font-family: sans-serif;
padding: 5px
}
.search-menu {
height: 600px;
background: #00003b;
width: 500px;
border: 1px solid black;
padding: 5px
}
.search-menu-list {
height: 100%;
width: 100%;
}
.search-menu-list input {
width: 100%;
height: 30px;
font-size: 16px;
margin-bottom: 5px;
padding: 0 4px 0 4px;
}
.search-menu-list ul {
list-style: none;
margin: 0; border: 0; padding: 0;
overflow: hidden;
overflow-y: scroll;
background: white;
width: 100%; height: 100%;
border: 1px solid black;
}
.search-menu-list li {
padding: 10px 5px 10px 5px;
margin: -1px -1px 0 -1px;
border-top: 1px solid black;
-ms-user-select: none;
cursor: default;
}
.search-menu-list li:hover {
background: #f2f2f2;
}
</style>
</head>
<body>
<div class="search-menu">
<div class="search-menu-list">
<input placeholder="Start typing to search...">
<ul>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
<li>This is a test list item</li>
</ul>
<div>
</div>
</body>
</html>
时,它们都在同一个线程的队列中运行,因此,直到1个任务没有完成,下一个任务才会启动。
因为你从未完成任务......下一个任务将无法启动
答案 1 :(得分:1)
您好感谢Stallion和royB重播......我发现导致问题的原因......
多个AsynC任务的标准如下,
在甜甜圈之前(直到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循环,那些异步任务永远不会完成所以新的AsyncTask将进入队列并没有让线程执行。 现在我确保Async Task在其工作结束后正确终止。在我的修复之后你可以看到下面的异步任务(线程)可用(处于等待状态)以占用新的任务......