我运行 flutter 的插件 image_picker
的样本。
当我从图库中一张一张地挑选图像时,内存不断增加。理想情况下是 memory should jump back
因为它at most select one image
在这个示例应用程序中。
class _MyHomePageState extends State<MyHomePage> {
File _imageFile; <-- this one keep the file of selected image.
dynamic _pickImageError;
bool isVideo = false;
VideoPlayerController _controller;
String _retrieveDataError;
void _onImageButtonPressed(ImageSource source) async {
...
try {
_imageFile = await ImagePicker.pickImage(source: source); <--- how to set value
setState(() {});
} catch (e) {
_pickImageError = e;
}
...
}
@override
Widget build(BuildContext context) {
...
Image.file(_imageFile); <-- how to use it to display UI.
...
}
}
我的问题是如何
dispose the resource
由 File
使用?
最佳答案
只需选择一个 File
不会影响内存,因为File
只是一个引用,不保存文件系统实体的实际字节。创建 Image
但是,超出文件会增加内存使用量,因为 Image
保存 File
的所有字节它引用(一旦它读取了所有内容)。
根据您到目前为止所分享的内容,我们无法判断这是否是代码问题。除非您维护对超过 1 个 Image
的引用一次,最低 您的应用程序将使用的内存应反射(reflect)该图像的大小。我说最低 因为垃圾收集不会过于激进,并且不会在您不再引用它时立即处理所有内容。它只会在它知道需要时执行 GC 运行,这样应用程序不会饿死并且操作系统也很满意。我不知道这是否适用于 Flutter,但对于原生 Android,它还取决于制造商对 Android 操作系统的定制,它可以请求应用程序以各种频率运行 GC。
在内存分配清晰可见的用例中,只需在加载第二个图像后点击 GC 按钮。如果内存回落到与加载单个图像相同的水平,则一切正常。如果没有,您可能会在代码中的某处维护对这些图像的意外引用。
原生 Android 也有这个奇怪的东西(可能取决于版本/制造商)——这在一些较旧的三星设备上最为明显——最后 4 个位图被缓存,你无法清除该缓存,并且取决于大小您必须处理的位图,该缓存可能会占用应用程序的几乎所有可用内存,并且您最终会收到 OOM 错误...希望 Flutter 不会这样做,或者允许开发人员控制它。
关于flutter - 在flutter插件image_picker示例中从图库中选择图像时内存增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57899058/