BitmapFactory.Options.inBitmap вызывает разрыв при частом переключении растрового изображения ImageView
Мы столкнулись с ситуацией, когда мне нужно отображать изображения в слайд-шоу, которое очень быстро переключает изображение. Большое количество изображений заставляет меня сохранять данные JPEG в памяти и декодировать их, когда я хочу их отобразить. Чтобы облегчить сборщик мусора, ям используюBitmapFactory.Options.inBitmap повторно использовать растровые изображения.
К сожалению, это вызывает довольно серьезные разрывы, яМы пробовали разные решения, такие как синхронизация, семафоры, чередование 2-3 битовых карт, но, похоже, ни одно из них не решило проблему.
мы создали пример проекта, который демонстрирует эту проблему на GitHub;https://github.com/Berglund/android-tearing-exampleI»
у нас есть поток, который декодирует растровое изображение, устанавливает его в потоке пользовательского интерфейса и спит в течение 5 мс:
Runnable runnable = new Runnable() {
@Override
public void run() {
while(true) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
if(bitmap != null) {
options.inBitmap = bitmap;
}
bitmap = BitmapFactory.decodeResource(getResources(), images.get(position), options);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
try {
Thread.sleep(5);
} catch (InterruptedException e) {}
position++;
if(position >= images.size())
position = 0;
}
}
};
Thread t = new Thread(runnable);
t.start();
Моя идея состоит в том, что ImageView.setImageBitmap (Bitmap) рисует растровое изображение на следующем vsync, однако мыВозможно, мы уже декодируем следующий битовый массив, когда это произойдет, и поэтому мыМы начали изменять растровые пиксели. Думаю ли я в правильном направлении?
Кто-нибудь получил какие-либо советы о том, куда идти отсюда?