我正在开发一个发送传感器数据并通过UDP接收连接数据的应用。最初,应用程序只发送数据,并且只使用了1个AsyncTask。但是,由于协议更改,应用程序现在需要接收数据,这需要在自己的线程上处理并触发UI更新,因此,我已经为它创建了一个新的AsyncTask
问题:
独立运行时,AsyncTasks完美执行。但是,当我同时运行它们时,最终会完全阻止另一个。
我做过什么:
最初,我使用标准.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();
我希望这可行,然而,它没有。这两项任务仍相互阻碍。
可能导致这种情况的原因是什么?我的猜测可能是一个有限的池大小,因为这两个任务以非常频繁的速度发射(也许一个任务最终占据了池,没有留下任何自由线程),但话又说回来,我并不完全确定。
其他代码: 以下是我如何设置定时器来执行我的asynctasks:
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);
答案 0 :(得分:0)
两个线程的实际工作都发布到同一个处理程序,这意味着它将导致它们一个接一个地运行。如果在handler.post之前放置一个调试语句,您将看到它们都命中了该部分,然后开始顺序执行。你不能只使用新的Thread(){...}。start()?