Android Studio:E/UncaughtException:java.lang.OutOfMemoryError
我一直在寻找解决我问题的办法。最常见的建议是将android:hardwareAccelerated=“false”和android:largeHeap=“true”添加到清单中的应用程序标记中,但是我仍然会遇到以下错误:Android Studio:E/UncaughtException:java.lang.OutOfMemoryError,java,android,Java,Android,我一直在寻找解决我问题的办法。最常见的建议是将android:hardwareAccelerated=“false”和android:largeHeap=“true”添加到清单中的应用程序标记中,但是我仍然会遇到以下错误: E/UncaughtException:java.lang.OutOfMemoryError:无法分配56272字节的分配,该分配包含19848个可用字节和19KB的内存 位于java.lang.StringBuilder.toString(StringBuilder.ja
E/UncaughtException:java.lang.OutOfMemoryError:无法分配56272字节的分配,该分配包含19848个可用字节和19KB的内存
位于java.lang.StringBuilder.toString(StringBuilder.java:408)
位于org.chromiu.content\u public.browser.LoadUrlParams.buildDataUri(LoadUrlParams.java:113)
在org.chromiu.content\u public.browser.LoadUrlParams.createLoadDataParamsWithBaseUrl(LoadUrlParams.java:164)上
位于org.chromiu.android_webview.AwContents.loadDataWithBaseURL(AwContents.java:1523)
位于com.android.webview.chromium.webviewcromium.loadDataWithBaseURL(webviewcromium.java:609)
位于android.webkit.WebView.loadDataWithBaseURL(WebView.java:1015)
位于com.google.android.gms.internal.zzakn.loadDataWithBaseURL(未知来源)
位于com.google.android.gms.internal.zzakm.loadDataWithBaseURL(未知来源)
位于com.google.android.gms.internal.zzxy.zzgo(未知来源)
位于com.google.android.gms.internal.zzxq.zzgp(未知来源)
在com.google.android.gms.internal.zzxw.zza(未知来源)
位于com.google.android.gms.ads.internal.zzl.run(未知来源)
位于android.os.Handler.handleCallback(Handler.java:751)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6119)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
---------坠机开始
E/AndroidRuntime:致命异常:主
java.lang.OutOfMemoryError:无法分配56272字节的分配,该分配包含19848个可用字节和19KB的内存
位于java.lang.StringBuilder.toString(StringBuilder.java:408)
位于org.chromiu.content\u public.browser.LoadUrlParams.buildDataUri(LoadUrlParams.java:113)
在org.chromiu.content\u public.browser.LoadUrlParams.createLoadDataParamsWithBaseUrl(LoadUrlParams.java:164)上
位于org.chromiu.android_webview.AwContents.loadDataWithBaseURL(AwContents.java:1523)
位于com.android.webview.chromium.webviewcromium.loadDataWithBaseURL(webviewcromium.java:609)
位于android.webkit.WebView.loadDataWithBaseURL(WebView.java:1015)
位于com.google.android.gms.internal.zzakn.loadDataWithBaseURL(未知来源)
位于com.google.android.gms.internal.zzakm.loadDataWithBaseURL(未知来源)
位于com.google.android.gms.internal.zzxy.zzgo(未知来源)
位于com.google.android.gms.internal.zzxq.zzgp(未知来源)
在com.google.android.gms.internal.zzxw.zza(未知来源)
位于com.google.android.gms.ads.internal.zzl.run(未知来源)
位于android.os.Handler.handleCallback(Handler.java:751)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6119)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)上
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
我的建议是修改您的代码,从ImageItem
类中删除Bitmap
实例,如下所示
public class ImageItem {
private int arrayIndex;
private int imageResource;
private String title;
public ImageItem(int arrayIndex, int imageResource, String title) {
super();
this.arrayIndex = arrayIndex;
this.imageResource = imageResource;
this.title = title;
}
public int getImageResource() {
return imageResource;
}
public void setImageResource(int imageResource) {
this.imageResource = imageResource;
}
// rest methods should be same
}
public class GridViewAdapter extends ArrayAdapter<ImageItem> {
// your old logic here
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// your old logic here
// holder.image.setImageBitmap(item.getImage());
Picasso.with(context).load(item.getImageResource()).into(holder.image);
}
// your old logic here
}
dependencies {
...
compile 'com.squareup.picasso:picasso:2.5.0'
...
}
在GridViewAdapter
类中,从资源id加载图像,如下所示
public class ImageItem {
private int arrayIndex;
private int imageResource;
private String title;
public ImageItem(int arrayIndex, int imageResource, String title) {
super();
this.arrayIndex = arrayIndex;
this.imageResource = imageResource;
this.title = title;
}
public int getImageResource() {
return imageResource;
}
public void setImageResource(int imageResource) {
this.imageResource = imageResource;
}
// rest methods should be same
}
public class GridViewAdapter extends ArrayAdapter<ImageItem> {
// your old logic here
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// your old logic here
// holder.image.setImageBitmap(item.getImage());
Picasso.with(context).load(item.getImageResource()).into(holder.image);
}
// your old logic here
}
dependencies {
...
compile 'com.squareup.picasso:picasso:2.5.0'
...
}
最后一个是在应用程序的build.gradle
中添加编译依赖项,如下所示
public class ImageItem {
private int arrayIndex;
private int imageResource;
private String title;
public ImageItem(int arrayIndex, int imageResource, String title) {
super();
this.arrayIndex = arrayIndex;
this.imageResource = imageResource;
this.title = title;
}
public int getImageResource() {
return imageResource;
}
public void setImageResource(int imageResource) {
this.imageResource = imageResource;
}
// rest methods should be same
}
public class GridViewAdapter extends ArrayAdapter<ImageItem> {
// your old logic here
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// your old logic here
// holder.image.setImageBitmap(item.getImage());
Picasso.with(context).load(item.getImageResource()).into(holder.image);
}
// your old logic here
}
dependencies {
...
compile 'com.squareup.picasso:picasso:2.5.0'
...
}
完成。错误是因为
getData
方法将每个位图存储在内存中,而应用程序因内存不足而崩溃。Better选项不是将位图链接到ImageItem
类对象,而是使用图像路径的URI
,然后使用任何图像加载程序库(如Picasso
谢谢ELITE,您是否有任何代码调整建议来解决此问题?我很自豪自己能走到这一步,现在我只需要解决最后一个错误:DYou可以用压缩级别存储位图,因为大多数时候,当你试图处理位图时,你会遇到OOMHi@AjayPandya,你能告诉我如何在代码中更改它吗?我会非常感激的