Java 从缓存还原图片时出现android OutOfMemoryError
我的应用程序有一个GridView,其中每个项目都是ImageView。我编写了自定义适配器来将图像设置到ImageView中。使用AsyncTask异步设置图像 我的任务是从缓存还原映像Java 从缓存还原图片时出现android OutOfMemoryError,java,android,android-fragments,android-asynctask,out-of-memory,Java,Android,Android Fragments,Android Asynctask,Out Of Memory,我的应用程序有一个GridView,其中每个项目都是ImageView。我编写了自定义适配器来将图像设置到ImageView中。使用AsyncTask异步设置图像 我的任务是从缓存还原映像 @Override protected Bitmap doInBackground(Void... params) { return BitmapFactory.decodeFile(file.getAbsolutePath()); } @Override protected void onPostE
@Override
protected Bitmap doInBackground(Void... params) {
return BitmapFactory.decodeFile(file.getAbsolutePath());
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
// load image from db
}
}
放置在片段上的GridView。在替换了多个片段后,我在BitmapFactory.decodeFile(file.getAbsolutePath())行中出现了OutOfMemoryError代码>
请帮我解决这个问题。
谢谢大家! 不能将位图直接加载到内存中。定义生成的位图的大小,并使用此处描述的技术加载位图的缩放版本:
首先,您必须在清单中声明较大的堆大小。并根据代码使用位图循环。
对于manifest.xml
android:largeHeap=“true”
希望它对你有用。android:largeHeap=true
应该尽量避免,而且必须是最后的手段。你使用过位图回收吗?我使用过,但我的应用程序崩溃了,并显示消息“无法绘制回收的位图”
E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:864)
Caused by: java.lang.OutOfMemoryError: (Heap Size=131079KB, Allocated=126797KB)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:658)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:347)
at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:430)
at com.ThreeBoots.utils.ImageProcessor$2.doInBackground(ImageProcessor.java:248)
at com.ThreeBoots.utils.ImageProcessor$2.doInBackground(ImageProcessor.java:245)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:864)
if (bm != null) {
bm.recycle();
bm = null;
}