Mam projekt Androida złożony z jednego układu z ImageView.Android - Zaktualizuj bitmapę z wątku timera
public class MainActivity extends AppCompatActivity {
/* original and stretched sized bitmaps */
private Bitmap bitmapOriginal;
private Bitmap bitmapStretched;
/* the only view */
private ImageView iv;
....
}
ImageView ta jest aktualizowana przez ten runnable funkcji
runnable = new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bitmapStretched);
}
};
i runnable jest prowadzony przez zwłokę funkcji JNI, działa na wątek tła, które nazywają go 60 razy na sekundę.
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);
}
Po narysowaniu jakiejś ramki aplikacja ulega awarii wraz z następującym komunikatem.
A/OpenGLRenderer: Task is already in the queue!
Domyślam się, że jest to spowodowane tym, że renderer nie zakończył w pełni renderowania poprzedniej klatki ImageView i wpada w złość.
Jeśli usunąć runOnUiThread(runnable);
problem zniknie (oczywiście)
Jak można tego uniknąć? Jak mogę zsynchronizować moją aplikację z rendererem OpenGL?
Próbowałem również rozszerzyć ImageView i narysować mapę bitową na płótnie do funkcji OnDraw ale mam ten sam rezultat
Niech to ci pomoże. http://stackoverflow.com/questions/5869114/loading-new-image-each-second –
wypróbuj to, aby sprawdzić, czy poprzedni wątek jest zrobiony czy nie. sprawdź to http://stackoverflow.com/questions/8799373/waiting-for-a-runnable-to-complete-before-running-another-runnable – Abhishek