У меня есть проект Android, состоящий из одного макета с ImageView.
public class MainActivity extends AppCompatActivity {
/* original and stretched sized bitmaps */
private Bitmap bitmapOriginal;
private Bitmap bitmapStretched;
/* the only view */
private ImageView iv;
....
}
Этот ImageView обновляется этой выполняемой функцией
runnable = new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmapStretched);
}
};
а runnable выполняется временной функцией JNI, работающей на фоновом потоке, который вызывает ее 60 раз в секунду.
public void jniTemporizedCallback(int buf[]) {
/* set data to original sized bitmap */
bitmapOriginal.setPixels(buf, 0, origWidth, 0, 0, origWidth, origHeight);
/* calculate the stretched one */
bitmapStretched = Bitmap.createScaledBitmap(bitmapOriginal, width, height, false);
/* tell the main thread to update the image view */
runOnUiThread(runnable);
}
После того, как какой-то фрейм будет нарисован, приложение выйдет со следующим сообщением.
A/OpenGLRenderer: Task is already in the queue!
Я предполагаю, что это связано с тем, что рендеринга не удалось полностью отобразить предыдущий кадр ImageView и рассердиться.
Если я удалю runOnUiThread(runnable);
, проблема исчезнет (очевидно)
Как это можно избежать? Как я могу синхронизировать свое приложение с рендерером openGL?
Я также попытался расширить ImageView и нарисовать растровое изображение на холсте в функции onDraw, но получил тот же результат