udp网络上的定时发送因java.lang.IllegalMonitorStateException失败

时间:2019-06-05 11:06:36

标签: java android android-asynctask udp

我需要按时间间隔(每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()调用上,但是我找不到简单的方法来达到相同的结果。

1 个答案:

答案 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()调用中使用网络绑定资源而引起的异常而编写的。在我之前的代码中,这些调用是在与上述完全相同的计时器内直接执行的。现在,我必须像这样包装所有东西……对我来说似乎是胡说八道。