Ошибка отправки по тайм-ауту в сети для java.lang.IllegalMonitorStateException - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно отправлять данные через UDP соединение по времени (один раз каждые 20 мс).Я пытался использовать 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 голосов
/ 18 июня 2019

Решение этой проблемы заключается в упрощении метода 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().В моем предыдущем коде эти вызовы выполнялись прямо в том же таймере, что и выше.Теперь я должен обернуть все, как это ... выглядит для меня бессмысленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...