diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index a5bc96401f7f1..f9fcf975c8616 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -30,7 +30,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; @@ -433,7 +432,7 @@ final class ImageReaderSurfaceProducer private Object lock = new Object(); // REQUIRED: The following fields must only be accessed when lock is held. - private final LinkedList imageReaderQueue = new LinkedList(); + private final ArrayList imageReaderQueue = new ArrayList(); private final HashMap perImageReaders = new HashMap(); private PerImageReader lastReaderDequeuedFrom = null; @@ -452,7 +451,7 @@ public PerImage(Image image, long queuedTime) { /** Internal class: state held per ImageReader. */ private class PerImageReader { public final ImageReader reader; - private final LinkedList imageQueue = new LinkedList(); + private final ArrayList imageQueue = new ArrayList(); private boolean closed = false; private final ImageReader.OnImageAvailableListener onImageAvailableListener = @@ -485,7 +484,7 @@ PerImage queueImage(Image image) { imageQueue.add(perImage); // If we fall too far behind we will skip some frames. while (imageQueue.size() > 2) { - PerImage r = imageQueue.removeFirst(); + PerImage r = imageQueue.remove(0); r.image.close(); } return perImage; @@ -495,7 +494,7 @@ PerImage dequeueImage() { if (imageQueue.size() == 0) { return null; } - PerImage r = imageQueue.removeFirst(); + PerImage r = imageQueue.remove(0); return r; } @@ -535,12 +534,12 @@ void pruneImageReaderQueue() { } // Prune nodes from the head of the ImageReader queue. while (imageReaderQueue.size() > 1) { - PerImageReader r = imageReaderQueue.peekFirst(); + PerImageReader r = imageReaderQueue.get(0); if (!r.canPrune()) { // No more ImageReaders can be pruned this round. break; } - imageReaderQueue.removeFirst(); + imageReaderQueue.remove(0); perImageReaders.remove(r.reader); r.close(); } @@ -580,7 +579,8 @@ void onImage(ImageReader reader, Image image) { PerImage dequeueImage() { PerImage r = null; synchronized (lock) { - for (PerImageReader reader : imageReaderQueue) { + for (int i = 0; i < imageReaderQueue.size(); i++) { + PerImageReader reader = imageReaderQueue.get(i); r = reader.dequeueImage(); if (r == null) { // This reader is probably about to get pruned. @@ -618,8 +618,11 @@ PerImage dequeueImage() { private void releaseInternal() { released = true; - for (PerImageReader pir : perImageReaders.values()) { - pir.close(); + for (int i = 0; i < perImageReaders.size(); i++) { + PerImageReader reader = perImageReaders.get(i); + if (reader != null) { + reader.close(); + } } perImageReaders.clear(); imageReaderQueue.clear(); @@ -735,7 +738,10 @@ private PerImageReader getActiveReader() { // Create a new ImageReader and add it to the queue. return getOrCreatePerImageReader(createImageReader()); } - return imageReaderQueue.peekLast(); + if (imageReaderQueue.size() == 0) { + return null; + } + return imageReaderQueue.get(imageReaderQueue.size() - 1); } } @@ -809,8 +815,8 @@ public int numImageReaders() { public int numImages() { int r = 0; synchronized (lock) { - for (PerImageReader reader : imageReaderQueue) { - r += reader.imageQueue.size(); + for (int i = 0; i < imageReaderQueue.size(); i++) { + r += imageReaderQueue.get(i).imageQueue.size(); } } return r;