2017-03-22 4 views
0

So habe ich diese Anwendung auf Play Store, die Menschen hilft, ihr Telefon zu reinigen, und ich habe einige Fehlermeldungen erhalten, dass wenn die Leute auf "clean" klicken die App abstürzt und wegen outofmemoryerror. Hier ist die Fehlermeldung:Android java.lang.OutOfMemoryError auf Android 6.0

java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 147468 byte allocation with 24512 free bytes and 23KB until OOM 
    at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856) 
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675) 
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228) 
    at android.content.res.Resources.loadDrawableForCookie(Resources.java:4215) 
    at android.content.res.Resources.loadDrawable(Resources.java:4089) 
    at android.content.res.Resources.getDrawable(Resources.java:2005) 
    at android.content.res.Resources.getDrawable(Resources.java:1987) 
    at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:977) 
    at android.app.ApplicationPackageManager.loadUnbadgedItemIcon(ApplicationPackageManager.java:2842) 
    at android.app.ApplicationPackageManager.loadItemIcon(ApplicationPackageManager.java:2774) 
    at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:220) 
    at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:206) 
    at panda.cleaner.cleaner_batterysaver.fragment.SoftwareManageFragment$1.doInBackground(SoftwareManageFragment.java:139) 
    at panda.cleaner.cleaner_batterysaver.fragment.SoftwareManageFragment$1.doInBackground(SoftwareManageFragment.java:127) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

Hier ist die Klasse, in der der Fehler herkommt:

task = new AsyncTask<Void, Integer, List<AppInfo>>() { 
      private int mAppCount = 0;//(SoftwareManageFragment.java:127) 

@Override 
      protected List<AppInfo> doInBackground(Void... params) { 
       PackageManager pm = mContext.getPackageManager(); 
       List<PackageInfo> packInfos = pm.getInstalledPackages(0); 
       publishProgress(0, packInfos.size()); 
       List<AppInfo> appinfos = new ArrayList<AppInfo>(); 
       for (PackageInfo packInfo : packInfos) { 
        publishProgress(++mAppCount, packInfos.size()); 
        final AppInfo appInfo = new AppInfo(); 
        Drawable appIcon = packInfo.applicationInfo.loadIcon(pm);//(SoftwareManageFragment.java:139) 
        appInfo.setAppIcon(appIcon); 

        int flags = packInfo.applicationInfo.flags; 

        int uid = packInfo.applicationInfo.uid; 

        appInfo.setUid(uid); 

        if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 
         appInfo.setUserApp(false);//系统应用 
        } else { 
         appInfo.setUserApp(true);//用户应用 
        } 
        if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 
         appInfo.setInRom(false); 
        } else { 
         appInfo.setInRom(true); 
        } 
        String appName = packInfo.applicationInfo.loadLabel(pm).toString(); 
        appInfo.setAppName(appName); 
        String packname = packInfo.packageName; 
        appInfo.setPackname(packname); 
        String version = packInfo.versionName; 
        appInfo.setVersion(version); 
        try { 
         mGetPackageSizeInfoMethod.invoke(mContext.getPackageManager(), new Object[]{ 
           packname, 
           new IPackageStatsObserver.Stub() { 
            @Override 
            public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { 
             synchronized (appInfo) { 
              appInfo.setPkgSize(pStats.cacheSize + pStats.codeSize + pStats.dataSize); 

             } 
            } 
           } 
         }); 
        } catch (Exception e) { 
        } 

        appinfos.add(appInfo); 
       } 
       return appinfos; 
      } 

Seit ich bin nur ein Junior-Entwickler, ich bin nicht sicher, was das Problem sein könnte. Ein bestimmtes Telefon, das diesen Fehler erkannt hat, verwendet Android 6.0. Die Hilfe wird sehr geschätzt. Vielen Dank im Voraus.

+0

Wenn Sie einen Verweis auf Ihr Fragment oder Aktivität haben und dreht der Benutzer den Bildschirm Sie AysncTasks undicht werden könnten, und das würde dazu führen, Ressourcen länger beibehalten werden (Leben der Aysnktask). Aber ich kann nicht sicher sein, bis Sie mehr Code posten. Sie könnten versuchen, den Bildschirm zu drehen und zu sehen, ob Sie ihn neu erstellen können. Viel Glück :) – DataDino

+0

24512 Bytes entspricht 0,02 mb. Achte auf den Speicher, den deine App verwendet. Verwenden Sie das Speicherüberwachungsprogramm von IDE. – azizbekian

+0

Der Benutzer kann die Anwendung nicht einmal im Querformat verwenden, so dass der Benutzer den Bildschirm nicht wirklich drehen kann? Welchen Code soll ich mehr posten? – Kenertj

Antwort

0

Dies ist nicht das Hauptproblem, das ich vermute. Sie sollten die Speicherüberwachungsfunktion für den Speichermangel auschecken. Öffnen Sie zunächst die Aktivität, bei der der Fehler aufgetreten ist, und drücken Sie dann die Zurück-Taste, um zu prüfen, ob eine Leckage vorliegt.
Es gibt einige Dinge, die Sie bei dieser Ausnahme tun können.
In Android-Manifest sollten Sie largeheap = true unter Application-Tag anhängen.
Sie können Bitmap oder ziehbar Dateien mit Konfigurations laden und ihren Platz machen unteren

+0

Danke für die Hilfe! – Kenertj

Verwandte Themen