在调整大小时加载应用程序图标并获取OutOfMemory异常

时间:2016-01-07 17:14:41

标签: android bitmap out-of-memory

以下是代码:(显示进度条时所有执行的异步)

List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
for (ResolveInfo app : apps) {
    String label = app.activityInfo.loadLabel(pm).toString();
    Drawable icon = app.activityInfo.loadIcon(pm);
    Drawable resizedIcon = null;
    if (icon instanceof BitmapDrawable) {
        resizedIcon = Graphics.resize(icon, res, iconW, iconH);
    }
    AppInfo ai = new AppInfo(app, label, resizedIcon);
    items.add(ai);
}

以下是Graphics.resize()

Bitmap b = ((BitmapDrawable)image).getBitmap();
Bitmap bitmapResized = Bitmap.createScaledBitmap(b, widthPx, heightPx, false);
b.recycle();
return new BitmapDrawable(res, bitmapResized);

一般情况下一切正常,但我在调用Bitmap.createScaledBitmap时确实收到了有关内存不足异常的报告(我试图将其重新调整为32dp) 我阅读了有关处理和显示位图的内容,但在这里,我希望在用户看到应用程序名称时立即显示应用程序图标,而不仅仅是开始加载。 (我可以使用RecyclerView

来实现

2 个答案:

答案 0 :(得分:0)

当系统无法满足应用程序特殊资源的需求时,您将收到此错误,因为您可以看到这种情况正在发生,因为内存不足

通过向process中的应用程序标记添加attribute,可以增加提供给应用程序的堆内存量AndroidManifest.xml

android:largeHeap="true"

您的应用标签看起来像这样......

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">

虽然它会增加提供给应用程序的内存(process)。它并不能保证它足以完成您想要执行的任务。

如果您尝试启动内存昂贵的Task,请添加代码

    System.gc();

这可能会在堆上释放一些内存。但它完全取决于DVM ( Dalivik Virtual Machine)来处理heap

请确保在开始繁重的task之前调用此方法,否则在完成任务后调用它将毫无用处。

如果您在emulator上遇到此问题,可以尝试增加AVD (Android Virtual Device)的堆内存

AVD edit

在处理位图图像时尽量让它们尽可能小,它们是OutOfMemory错误的常见罪魁祸首。

答案 1 :(得分:0)

您可以将large heap属性设置为true。

还有一种方法可以在该图像中使用图像加载器,这样您获得的图标将存储在设备上。