ReleaseonTrimMemoryListener
after ImageReaderSurfaceProducer
released. (flutter/engine#55760)
Fixes https://github.com/flutter/flutter/issues/156434. A better fix for the workaround in https://github.com/flutter/flutter/issues/156158. This should likely be cherrypicked, as it's a memory leak, safe, and avoids workaround code in plugins.
This commit is contained in:
parent
e118869e40
commit
8e3b58f166
@ -705,6 +705,7 @@ public class FlutterRenderer implements TextureRegistry {
|
|||||||
private void releaseInternal() {
|
private void releaseInternal() {
|
||||||
cleanup();
|
cleanup();
|
||||||
released = true;
|
released = true;
|
||||||
|
removeOnTrimMemoryListener(this);
|
||||||
imageReaderProducers.remove(this);
|
imageReaderProducers.remove(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
package io.flutter.embedding.engine.renderer;
|
package io.flutter.embedding.engine.renderer;
|
||||||
|
|
||||||
|
import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
|
||||||
import static android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
|
import static android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
@ -671,7 +672,7 @@ public class FlutterRendererTest {
|
|||||||
|
|
||||||
// Invoke the onTrimMemory callback with level 40.
|
// Invoke the onTrimMemory callback with level 40.
|
||||||
// This should result in a trim.
|
// This should result in a trim.
|
||||||
texture.onTrimMemory(40);
|
texture.onTrimMemory(TRIM_MEMORY_BACKGROUND);
|
||||||
shadowOf(Looper.getMainLooper()).idle();
|
shadowOf(Looper.getMainLooper()).idle();
|
||||||
|
|
||||||
assertEquals(0, texture.numImageReaders());
|
assertEquals(0, texture.numImageReaders());
|
||||||
@ -769,12 +770,33 @@ public class FlutterRendererTest {
|
|||||||
producer.setCallback(callback);
|
producer.setCallback(callback);
|
||||||
|
|
||||||
// Trim memory.
|
// Trim memory.
|
||||||
((FlutterRenderer.ImageReaderSurfaceProducer) producer).onTrimMemory(40);
|
flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND);
|
||||||
|
|
||||||
// Verify.
|
// Verify.
|
||||||
verify(callback).onSurfaceDestroyed();
|
verify(callback).onSurfaceDestroyed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ImageReaderSurfaceProducerUnsubscribesWhenReleased() {
|
||||||
|
// Regression test for https://github.com/flutter/flutter/issues/156434.
|
||||||
|
FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer();
|
||||||
|
TextureRegistry.SurfaceProducer producer = flutterRenderer.createSurfaceProducer();
|
||||||
|
|
||||||
|
// Create and set a mock callback.
|
||||||
|
TextureRegistry.SurfaceProducer.Callback callback =
|
||||||
|
mock(TextureRegistry.SurfaceProducer.Callback.class);
|
||||||
|
producer.setCallback(callback);
|
||||||
|
|
||||||
|
// Release the surface.
|
||||||
|
producer.release();
|
||||||
|
|
||||||
|
// Call trim memory.
|
||||||
|
flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND);
|
||||||
|
|
||||||
|
// Verify was not called.
|
||||||
|
verify(callback, never()).onSurfaceDestroyed();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ImageReaderSurfaceProducerIsCreatedOnLifecycleResume() throws Exception {
|
public void ImageReaderSurfaceProducerIsCreatedOnLifecycleResume() throws Exception {
|
||||||
FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer();
|
FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer();
|
||||||
@ -795,7 +817,7 @@ public class FlutterRendererTest {
|
|||||||
producer.setCallback(callback);
|
producer.setCallback(callback);
|
||||||
|
|
||||||
// Trim memory.
|
// Trim memory.
|
||||||
((FlutterRenderer.ImageReaderSurfaceProducer) producer).onTrimMemory(40);
|
flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND);
|
||||||
|
|
||||||
// Trigger a resume.
|
// Trigger a resume.
|
||||||
((LifecycleRegistry) ProcessLifecycleOwner.get().getLifecycle())
|
((LifecycleRegistry) ProcessLifecycleOwner.get().getLifecycle())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user