Android java.lang.OutOfMemoryError android 6.0
Android java.lang.OutOfMemoryError on android 6.0
所以我在 Play 商店上有这个应用程序,它可以帮助人们清理他们的 phone 并且我收到了一些错误消息,当人们单击 "clean" 按钮时应用程序崩溃并且因为内存不足错误。
这是错误消息:
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.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.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.doInBackground(SoftwareManageFragment.java:139)
at panda.cleaner.cleaner_batterysaver.fragment.SoftwareManageFragment.doInBackground(SoftwareManageFragment.java:127)
at android.os.AsyncTask.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
这里是 class 错误的来源:
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;
}
由于我只是一名初级开发人员,所以我不确定问题出在哪里。捕获此错误的特定 phone 使用 Android 6.0.Help 将非常适用。提前致谢。
我想这不是主要问题。您应该检查内存监视器是否存在内存不足异常。先打开出现错误的activity然后按返回键检查是否有漏水。
对于此异常,您几乎无能为力。
在 android 清单中,您应该在 application 标签下附加 largeheap = true。
您可以使用配置加载位图或可绘制文件,并使它们的 space 降低
您不能动态增加堆大小,但可以请求使用更多。
所以,您必须在 manifest.xml 文件中添加 android:largeHeap="true"
行,您的问题才会得到解决。
像这样:
<application
android:largeHeap="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
您的应用程序进程是否应使用大型 Dalvik 堆创建。这适用于为应用程序创建的所有进程。它仅适用于加载到进程中的第一个应用程序;如果您使用共享用户 ID 来允许多个应用程序使用一个进程,则它们都必须一致地使用此选项,否则它们将产生不可预知的结果。大多数应用程序不需要这个,而是应该专注于减少整体内存使用量以提高性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制。
参考:@Maveňツ回答
所以我在 Play 商店上有这个应用程序,它可以帮助人们清理他们的 phone 并且我收到了一些错误消息,当人们单击 "clean" 按钮时应用程序崩溃并且因为内存不足错误。 这是错误消息:
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask.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.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.doInBackground(SoftwareManageFragment.java:139)
at panda.cleaner.cleaner_batterysaver.fragment.SoftwareManageFragment.doInBackground(SoftwareManageFragment.java:127)
at android.os.AsyncTask.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
这里是 class 错误的来源:
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;
}
由于我只是一名初级开发人员,所以我不确定问题出在哪里。捕获此错误的特定 phone 使用 Android 6.0.Help 将非常适用。提前致谢。
我想这不是主要问题。您应该检查内存监视器是否存在内存不足异常。先打开出现错误的activity然后按返回键检查是否有漏水。
对于此异常,您几乎无能为力。
在 android 清单中,您应该在 application 标签下附加 largeheap = true。
您可以使用配置加载位图或可绘制文件,并使它们的 space 降低
您不能动态增加堆大小,但可以请求使用更多。
所以,您必须在 manifest.xml 文件中添加 android:largeHeap="true"
行,您的问题才会得到解决。
像这样:
<application
android:largeHeap="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
您的应用程序进程是否应使用大型 Dalvik 堆创建。这适用于为应用程序创建的所有进程。它仅适用于加载到进程中的第一个应用程序;如果您使用共享用户 ID 来允许多个应用程序使用一个进程,则它们都必须一致地使用此选项,否则它们将产生不可预知的结果。大多数应用程序不需要这个,而是应该专注于减少整体内存使用量以提高性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制。
参考:@Maveňツ回答