gpt4 book ai didi

java - 显示与所有应用程序的对话框时出现 android outOfMemoryError

转载 作者:行者123 更新时间:2023-12-01 06:17:48 26 4
gpt4 key购买 nike

我在显示一个显示所有已安装应用程序的对话框时收到此消息

E/AndroidRuntime( 1148): java.lang.OutOfMemoryError
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:596)
E/AndroidRuntime( 1148): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
E/AndroidRuntime( 1148): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:832)
E/AndroidRuntime( 1148): at android.content.res.Resources.loadDrawable(Resources.java:2988)
E/AndroidRuntime( 1148): at android.content.res.Resources.getDrawable(Resources.java:1558)
E/AndroidRuntime( 1148): at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:712)
E/AndroidRuntime( 1148): at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:149)
E/AndroidRuntime( 1148): at android.content.pm.ComponentInfo.loadDefaultIcon(ComponentInfo.java:167)
E/AndroidRuntime( 1148): at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:154)
E/AndroidRuntime( 1148): at android.content.pm.ResolveInfo.loadIcon(ResolveInfo.java:226)

在对话框中,我正在迭代 ResolveInfoList 并通过以下方式加载应用程序图标:

Drawable app_icon = allappslist.get(i).loadIcon(context.getPackageManager()));

但这有时会产生上面的错误...

最佳答案

我在 Google 开发者控制台的崩溃和 ANR 报告中发现了此问题:java.lang.OutOfMemoryError:无法分配具有 250994 个可用字节和 245KB 的 1048588 字节分配,直到 OOM

无论如何,由于我的应用程序还获取所有已安装的应用程序,因此我做了一些事情。

1- 二手 LruCache类来缓存所有位图,您也可以使用我在 StackOverFlow 的答案中找到的此类:

import android.support.v4.util.LruCache;

//This class to cache bitmap apps icon
public class Cache {

private static Cache instance;
private LruCache<Object, Object> lru;

//------------------------------------------------------------------------//
private Cache() {
lru = new LruCache<>(5 * 1024 * 1024) //Max is 5MB;
}
//------------------------------------------------------------------------//
public static Cache getInstance() {
if (instance == null) {
instance = new Cache();
}
return instance;
}
//------------------------------------------------------------------------//
public LruCache<Object, Object> getLru() {
return lru;
}
}
<小时/>

2- 使用 Bitmap.createScaledBitmap 减小应用程序图标尺寸,这将减小其大小,more details .

<小时/>

检查缓存并获取位图的代码 fragment :

Object appBitmap = Cache.getInstance().getLru().get(this.packageName);
if(appBitmap == null){
Drawable drawableAppIcon = packageInfo.applicationInfo.loadIcon(packageManager);
Bitmap bitmap = ((BitmapDrawable)drawableAppIcon).getBitmap();
this.appIcon = Bitmap.createScaledBitmap(bitmap, 40,40,true);
Cache.getInstance().getLru().put(this.packageName, this.appIcon);
} else{
this.appIcon = (Bitmap)appBitmap;
}

祝你好运!

关于java - 显示与所有应用程序的对话框时出现 android outOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19911799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com