【发布时间】:2014-03-18 07:07:18
【问题描述】:
我正在开发一个通过 UDP 发送传感器数据和接收连接数据的应用。最初,该应用只发送数据,并且只使用了 1 个 AsyncTask。但是,由于协议更改,应用程序现在需要接收数据,这需要在自己的线程上处理并触发 UI 更新,因此,我为它创建了一个新的 AsyncTask
问题:
独立运行时,AsyncTask 可以完美执行。但是,当我同时运行它们时,一个最终会完全阻塞另一个。
我尝试了什么:
最初,我使用标准的 .execute() 来启动我的 AsyncTasks。在阅读了类似的问题之后,我已经实现了下面的功能,希望强制并行执行:
void startAsyncTask(AsyncTask<Void, Void, Void> asyncTask) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
asyncTask.execute();
我希望这会起作用,但是,它没有。这两个任务仍然相互阻塞。
什么可能导致这种情况?我的猜测可能是池的大小有限,因为这两个任务以非常频繁的速率触发(也许一个任务最终支配了池,没有留下空闲线程),但话又说回来,我并不完全确定。
附加代码: 以下是我如何设置计时器来执行我的异步任务:
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
if (dataClient.getStatus() == AsyncTask.Status.FINISHED) {
dataClient = new udpClient();
}
if (dataClient.getStatus() != AsyncTask.Status.RUNNING) {
if(sensorValues != null) {
if(isUdpEnabled)
startAsyncTask(dataClient);
}
}
}
});
}
};
timer.schedule(task, 0, 25);
timer2 = new Timer();
task2 = new TimerTask() {
@Override
public void run() {
handler2.post(new Runnable() {
public void run() {
if (broadcastClient.getStatus() == AsyncTask.Status.FINISHED) {
broadcastClient = new udpBroadcastClient();
}
if (broadcastClient.getStatus() != AsyncTask.Status.RUNNING) {
Log.d("broadcast test", "Timer fire");
startAsyncTask(broadcastClient);
Log.d("broadcast test", "After execute line reached");
}
}
});
}
};
timer2.schedule(task2, 0, 50);
【问题讨论】:
-
使用
executeOnExecutor()将起作用。你走在正确的道路上。 -
发布
startAsyncTask()方法。 -
AsyncTask 在队列中一个接一个地运行,如果一个已经运行第二个不会开始执行,直到第一个将完成他的工作,执行服务developer.android.com/reference/java/util/concurrent/…
-
THREAD_POOL_EXECUTOR 应该可以工作。我从来没有遇到过问题。但是您可能对最大池大小是正确的。如果你并行执行很多任务,它们很可能会互相阻塞。
-
@HamidShatu :方法已发布。有什么建议吗?
标签: java android multithreading android-asynctask