flutter - 在flutter插件image_picker示例中从图库中选择图像时内存增加

标签 flutter plugins imagepicker

我运行 flutter 的插件 image_picker的样本。

当我从图库中一张一张地挑选图像时,内存不断增加。理想情况下是 memory should jump back因为它at most select one image在这个示例应用程序中。

enter image description here

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 resourceFile 使用?

最佳答案

只需选择一个 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/

相关文章:

jquery - 从 jCarousel 插件中删除项目

Flutter:在 Future 函数中使用 try/catch

swiftui - 如何在 SwiftUI 中对 Imagepicker 进行两次单独调用?

dart - 将 onGenerateRoute 与 Flutter 后退按钮一起使用时断言失败

database - 首次在sembast中创建商店初始化

android - 构建.gradle : The option 'android.enableR8' is deprecated and should not be used anymore

c++ - 在 C++ 插件中卸载静态实例变量?

php - wp_user_create - 设置角色 - Wordpress

dart - '无效的覆盖。实现接口(interface)时类型不是子类型

Flutter & Navigator & ImagePicker : Why can I proceed to the next page? 查找停用的小部件的祖先是不安全的