2

インストールされているすべてのアプリを示すダイアログを表示しているときにこれを取得します

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)

ダイアログで、次の方法でアプリのアイコンを読み込んでいます ListResolveInfo

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

しかし、これにより上記のエラーが発生することがあります...

4

2 に答える 2

1

Crashes & ANRsレポート で Google Developer Console からこの問題を受け取りました。java.lang.OutOfMemoryError: Failed to allocate a 1048588 byte allocation with 250994 free bytes and 245KB until 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のサイズを縮小します。これにより、サイズが縮小されます。詳細.


キャッシュをチェックしてビットマップを取得するコードのスニペット:

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;
}

頑張ってください!

于 2016-03-03T20:14:53.963 に答える