【问题标题】:Getting a lot of App Icons makes Out Of Memory获取大量应用程序图标会导致内存不足
【发布时间】:2013-06-06 09:47:19
【问题描述】:

我创建了一个应用程序来加载所有已安装的应用程序。现在工作正常。 但是对于一些有很多应用程序的手机/平板电脑,我的应用程序由于内存不足而崩溃。 下面是获取应用信息的源代码

String appName = p.applicationInfo.loadLabel(packageManager).toString();
                    String packageName = p.packageName;
                    String appFile = a.sourceDir;
                    long lastUpdated = new File(appFile).lastModified();
                    Drawable icon = a.loadIcon(packageManager);
                    AppSize appSize = calculateSize(p.applicationInfo.sourceDir);
                    App application = new App(appName, packageName, lastUpdated, appSize.getSize(), appSize.getLongSize(), icon, false);

有没有办法优化上面的代码以避免内存不足? 谢谢。

【问题讨论】:

    标签: android out-of-memory


    【解决方案1】:

    请查看此链接:Displaying bitmaps efficiently

    也在这个开源库项目中:Universal Image loader

    当您的应用程序需要显示大量位图时,它会超出应用程序分配的内存。此外,当它们显示在网格、列表或视图寻呼机中时,在创建每个视图时会消耗更多内存。因此,您需要将这些图像缓存在内存或磁盘中,并使用这些链接中描述的技术有效地显示它们。

    加法

    看看这个: Get installed Applications with Name, Package Name, Version and Icon

    UIL 的可接受 URI 示例:

    String imageUri = "http://site.com/image.png"; // from Web
    String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
    String imageUri = "content://media/external/audio/albumart/13"; // from content provider
    String imageUri = "assets://image.png"; // from assets
    String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
    

    【讨论】:

    • 我尝试使用通用图像加载器。但是我的应用程序从设备获取图标(其他应用程序的图标),所以我不知道如何将 Uri 参数传递给 displayImage() 方法。你有什么想法吗?
    • 检查更新的答案。我使用了该代码 sn-p,并且能够将应用程序图标加载到 GridView 中。但我没有使用 UIL。我使用 setImageDrawable(); 直接加载它们;因为我能够获得图标 Drawbles。由于安装的应用程序不多,我没有遇到 OOM 问题。如果您能够获取图标的路径(我认为这是不可能的),您可以使用 file:/// 后跟路径,然后将其传递给 UIL 的 imageView.displayImage() 方法。如果我想出一个使用 UIL 解决您的问题的可行解决方案,我会更新答案。
    • 谢谢!我的问题是我不知道如何获取 url 并将其传递给 displayImage() 方法。你知道怎么做吗?
    • 不,我不知道如何获取已安装应用程序图标的路径。如果您查看我在答案中添加的链接,它会为您提供可绘制的本身。我认为无法获取应用程序图标的 URI 路径。我也在找。如果我找到任何东西,会告诉你的。使用drawables是直截了当的。你不需要UIL。但是,由于您面临 OOM 问题,我们需要为此找到一些解决方案。
    • 嗨,看看这个示例应用程序 [impressive-artworx.de/2011/list-all-installed-apps-in-style/].他正在使用后台线程来加载位图可绘制图标。所以,我认为这种方法将解决您的 OOM 问题。请注意,他没有使用谷歌 android 的 UIL 或 BitmapFun 示例。我试图提出使用这两种技术的解决方案,但我未能让它发挥作用。我也想得到图标的路径,但找不到办法。 packageInfo.loadicon 是返回图标 drawable 的唯一方法。
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2011-04-29
    • 2018-01-15
    • 2013-06-15
    相关资源
    最近更新 更多