Я создаю приложение 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, поэтому я буду очень благодарен за любую помощь, так как я уже несколько дней борюсь с этой проблемой.