2017-03-22 22 views
0

私はプレイストアにこのアプリケーションを持っています。これは人々が携帯電話をきれいにするのに役立ち、人々が「クリーン」ボタンをクリックするとアプリケーションがクラッシュし、outofmemoryerrorのためにエラーメッセージが表示されます。ここ はエラーメッセージです:ここでAndroidのjava.lang.OutOfMemoryError on 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) 

エラーがから来ているクラスです。

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

私はちょうどジュニア開発者ですので、私は問題が何であるかわかりません。このエラーを検出した特定の携帯電話はAndroid 6.0を使用していました。ありがとうございます。

+0

フラグメントまたはアクティビティへの参照があり、ユーザーが画面を回転すると、AysncTasksが漏れてリソースが長く保持される可能性がありますaysnctaskの人生)。 しかし、コードを投稿するまではわかりません。あなたは画面を回転させ、再作成できるかどうかを調べることができます。幸運:) – DataDino

+0

24512バイトは0.02メガバイトに等しいです。あなたのアプリが使用するメモリを世話してください。 IDEのメモリモニタツールを使用します。 – azizbekian

+0

ユーザーはアプリケーションをランドスケープモードで使用することもできないため、ユーザーは実際に画面を回転できません。どのようなコードを私はもっと投稿すべきですか? – Kenertj

答えて

0

これは私が想定している主な問題ではありません。メモリー不足の例外については、メモリー・モニターをチェックアウトする必要があります。最初にエラーが発生したアクティビティを開き、[戻る]ボタンを押して、漏れがないかどうかを確認します。
この例外に関して実行できることはいくつかあります。
アンドロイドマニフェストでは、アプリケーションタグの下にlargeheap = trueを追加する必要があります。
ビットマップまたはドローアブルファイルを構成で読み込み、スペースを小さくする

+0

助けてくれてありがとう! – Kenertj