以下是代码:(显示进度条时所有执行的异步)
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
)
答案 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)
的堆内存
在处理位图图像时尽量让它们尽可能小,它们是OutOfMemory
错误的常见罪魁祸首。
答案 1 :(得分:0)
您可以将large heap属性设置为true。
还有一种方法可以在该图像中使用图像加载器,这样您获得的图标将存储在设备上。