我需要按时间间隔(每20毫秒一次)通过广告UDP 连接发送数据。
我尝试使用Handler
/ Runnable
/ postDelayed()
方法...在 Android 9.0 之前,它都可以正常工作。
现在,我需要基于AsyncTask
使用另一种方法:
class SendCommandTask extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
try {
do{
sendCommands();
wait(UPDATE_DELAY);
} while(!isCancelled());
}
catch (Exception e)
{
Log.e(this.getClass().getName(), e.getMessage());
}
return null;
}
}
但无法抛出java.lang.IllegalMonitorStateException
。
我知道问题出在wait()
调用上,但是我找不到简单的方法来达到相同的结果。
答案 0 :(得分:0)
该问题的解决方案是简化仅执行一次doInBackground
调用的sendCommands()
方法:
class SendCommandTask extends AsyncTask<Object, Void, Void> {
@Override
protected Void doInBackground(Object[] param) {
try {
sendCommands();
}
catch (Throwable e)
{
Log.e(this.getClass().getName(), e.getMessage());
}
return null;
}
}
AsyncTask对象通过循环线程结构实例化并执行:
timerTask = new Runnable() {
@Override
public void run() {
new SendCommandTask().execute();
sendCommandsTimerHandler.postDelayed(this, UPDATE_DELAY);
}
};
在这种情况下,是一个简单的计时器。
请注意,所有这些都是为了避免由于在SendCommands()
调用中使用网络绑定资源而引起的异常而编写的。在我之前的代码中,这些调用是在与上述完全相同的计时器内直接执行的。现在,我必须像这样包装所有东西……对我来说似乎是胡说八道。