После нескольких часов профилирования, отладки и просмотра кода я обнаружил, что проблема
была вызвана неправильным просмотром недействительности в фоновом потоке
Должен использоваться метод View.postInvalidate () - этот метод проверяет, все ли прикреплено View к окну, а затем делает его недействительным.Вместо этого я неправильно использовал View.invalidate (), когда обрабатывал свое пользовательское сообщение от MainLooper, что редко вызывало сбои и заставляло MainLooper прекращать обработку других сообщений.
Для тех, у кого, возможно, возникла та же проблема, я добавил как правильное, так и неправильноекод.
ПРАВИЛЬНО:
public class GraphicOverlayView extends View { ... }
// Somewhere in background thread logic:
private GraphicOverlayView mGraphicOverlayView;
private void invalidateGraphicOverlayViewFromBackgroundThread(){
mGraphicOverlayView.postInvalidate();
};
НЕПРАВИЛЬНО:
public class GraphicOverlayView extends View { ... }
// Somewhere in background thread logic:
private GraphicOverlayView mGraphicOverlayView;
private final int MSG_INVALIDATE_GRAPHICS_OVERLAY = 1;
private Handler mUIHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INVALIDATE_GRAPHICS_OVERLAY:{
GraphicOverlayView overlay = (GraphicOverlayView)msg.obj;
// Next line can cause MainLooper stop processing other messages
overlay.invalidate();
break;
}
default:
super.handleMessage(msg);
}
}
};
private void invalidateGraphicOverlayViewFromBackgroundThread(){
Message msg = new Message();
msg.obj = mGraphicOverlayView;
msg.what = MSG_INVALIDATE_GRAPHICS_OVERLAY;
mUIHandler.dispatchMessage(msg);
};