Обработчик критических по времени L oop, на который влияет сборка мусора - PullRequest
1 голос
/ 03 августа 2020

Я создаю приложение Android, которое взаимодействует с DJI SDK для управления их дронами. Чтобы управлять полетом дрона, мне нужно отправлять управляющие команды в диапазоне 5–25 Гц. Я использую runnable внутри al oop для отправки моих данных, но я заметил, что иногда последующие итерации runnable задерживаются до 800 мс, из-за чего дрон перестает двигаться.

Мне удалось идентифицировать процесс сборки мусора приложения как виновника этих задержек, но я не знаю, как смягчить это, чтобы гарантировать, что мой l oop никогда не задерживается, поскольку это критично для полета. Я могу воспроизвести это, вызвав событие G C в профилировщике Android Studio.

Это соответствующий код, приложение в настоящее время содержит только этот logi c, пока я тестирую.

long delay = 200;

HandlerThread vsThread = new HandlerThread("VirtualStickHandler", Process.THREAD_PRIORITY_URGENT_AUDIO);
vsThread.start();
virtualStickDataHandler = new Handler(vsThread.getLooper());

virtualStickDataHandler.postDelayed(new Runnable() {
  @Override
  public void run() {
    mFlightController.sendVirtualStickFlightControlData(new FlightControlData(
        -.3f,
        0f,
        0f,
        0f
    ), null);
    virtualStickDataHandler.postDelayed(this, delay);
  }
}, delay);

К сожалению, мне не хватает знаний о потоках Android и G C, поэтому я буду очень благодарен за любую помощь, так как я уже несколько дней борюсь с этой проблемой.

...