在从定制的getView()'的OutOfMemoryError“BaseAdapter [英] 'outofmemoryerror' in the getView() from custom BaseAdapter

查看:176
本文介绍了在从定制的getView()'的OutOfMemoryError“BaseAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活性的网格布局,其中从标清文件夹显示图像。当我选择一个文件夹,所有图像都添加到字符串列表(清洁时更改文件夹),和图像的建设是getView()方法,用这些字符串从列表中。

I have an Activity with a grid layout where display images from SD folders. When I select a folder, all images are added to a String list (clean when folder is changed), and images construction is in getView() method, using these strings from the list.

它可以正常使用5或6倍(显示从文件夹中的图像),但后来我改变文件夹,我得到的getView一个OutOfMemoryError错误()从自定义BaseAdapter(见code线),但我不明白我的泄漏问题...

It works properly for 5 or 6 times (images from folder are displayed), but then I change the folder and I get an 'outofmemoryerror' in the getView() from the custom BaseAdapter (see code line), but I don't understand my leak problem...

图像30-100 KB的每一个。

Images are 30-100 kB each one.

这是code:

private ArrayList<String> itemList = new ArrayList<String>();

...

public void add(String path) {
    itemList.add(path); 
}

public void clean() {
    itemList.clear();
}

public View getView(int position, View convertView, ViewGroup parent)
{   
    ImageView imageView;
    if (convertView == null)
    {
        int iImageSize = mContext.getResources().getInteger(R.integer.grid_image_size);
        int iImagePadding = mContext.getResources().getInteger(R.integer.grid_image_padding);

        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(iImageSize, iImageSize));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(iImagePadding,iImagePadding,iImagePadding,iImagePadding);
    } 
    else
        imageView = (ImageView) convertView;

    String sImagePath = itemList.get(position);
    imageView.setTag(sImagePath);
    imageView.setImageURI(Uri.parse(sImagePath)); // Crash HERE

    return imageView;
}

跟踪日志:

10月4日至21日:10:50.697:E /艺术(1665):投掷的OutOfMemoryError无法分配与732188免费字节的1000012字节分配和715KB,直到OOM

04-21 10:10:50.697: E/art(1665): Throwing OutOfMemoryError "Failed to allocate a 1000012 byte allocation with 732188 free bytes and 715KB until OOM"

10月4日至21日:11:31.208:E / AndroidRuntime(1665):致命异常:主要
10月4日至21日:11:31.208:E / AndroidRuntime(1665):工艺:com.apps.apppictos,PID:1665
10月4日至21日:11:31.208:E / AndroidRuntime(1665):java.lang.OutOfMemoryError:无法分配与732188免费字节的1000012字节分配和715KB,直到OOM
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在dalvik.system.VMRuntime.newNonMovableArray(本机方法)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.BitmapFactory.nativeDe codeStream(本机方法)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.BitmapFactory.de codeStreamInternal(BitmapFactory.java:635)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.BitmapFactory.de codeStream(BitmapFactory.java:611)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:391)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.BitmapFactory.de codeFILE(BitmapFactory.java:417)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.graphics.drawable.Drawable.createFromPath(Drawable.java:1143)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.ImageView.resolveUri(ImageView.java:782)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.ImageView.setImageURI(ImageView.java:429)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在com.apps.apppictos.ImageAdapter.getView(ImageAdapter.java:93)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.AbsListView.obtainView(AbsListView.java:2347)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.GridView.makeAndAddView(GridView.java:1433)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.GridView.makeRow(GridView.java:361)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.GridView.fillDown(GridView.java:302)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.GridView.fillSpecific(GridView.java:582)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.GridView.layoutChildren(GridView.java:1287)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.AbsListView.onLayout(AbsListView.java:2151)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.View.layout(View.java:15671)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewGroup.layout(ViewGroup.java:5038)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.View.layout(View.java:15671)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewGroup.layout(ViewGroup.java:5038)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.FrameLayout.onLayout(FrameLayout.java:514)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.View.layout(View.java:15671)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewGroup.layout(ViewGroup.java:5038)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.View.layout(View.java:15671)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewGroup.layout(ViewGroup.java:5038)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.widget.FrameLayout.onLayout(FrameLayout.java:514)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.View.layout(View.java:15671)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewGroup.layout(ViewGroup.java:5038)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5885)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:767)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.Choreographer.doCallbacks(Choreographer.java:580)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.Choreographer.doFrame(Choreographer.java:550)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:753)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.os.Handler.handleCallback(Handler.java:739)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.os.Handler.dispatchMessage(Handler.java:95)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.os.Looper.loop(Looper.java:135)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在android.app.ActivityThread.main(ActivityThread.java:5257)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在java.lang.reflect.Method.invoke(本机方法)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在java.lang.reflect.Method.invoke(Method.java:372)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)
10月4日至21日:11:31.208:E / AndroidRuntime(1665):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
10月4日至21日:11:39.427:I /艺术(1665):从49MB钳目标GC堆到48MB

04-21 10:11:31.208: E/AndroidRuntime(1665): FATAL EXCEPTION: main 04-21 10:11:31.208: E/AndroidRuntime(1665): Process: com.apps.apppictos, PID: 1665 04-21 10:11:31.208: E/AndroidRuntime(1665): java.lang.OutOfMemoryError: Failed to allocate a 1000012 byte allocation with 732188 free bytes and 715KB until OOM 04-21 10:11:31.208: E/AndroidRuntime(1665): at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:391) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:417) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.graphics.drawable.Drawable.createFromPath(Drawable.java:1143) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.ImageView.resolveUri(ImageView.java:782) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.ImageView.setImageURI(ImageView.java:429) 04-21 10:11:31.208: E/AndroidRuntime(1665): at com.apps.apppictos.ImageAdapter.getView(ImageAdapter.java:93) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.AbsListView.obtainView(AbsListView.java:2347) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.GridView.makeAndAddView(GridView.java:1433) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.GridView.makeRow(GridView.java:361) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.GridView.fillDown(GridView.java:302) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.GridView.fillSpecific(GridView.java:582) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.GridView.layoutChildren(GridView.java:1287) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.AbsListView.onLayout(AbsListView.java:2151) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.View.layout(View.java:15671) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewGroup.layout(ViewGroup.java:5038) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.View.layout(View.java:15671) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewGroup.layout(ViewGroup.java:5038) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.View.layout(View.java:15671) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewGroup.layout(ViewGroup.java:5038) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.View.layout(View.java:15671) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewGroup.layout(ViewGroup.java:5038) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.View.layout(View.java:15671) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewGroup.layout(ViewGroup.java:5038) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.Choreographer.doCallbacks(Choreographer.java:580) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.Choreographer.doFrame(Choreographer.java:550) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.os.Handler.handleCallback(Handler.java:739) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.os.Handler.dispatchMessage(Handler.java:95) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.os.Looper.loop(Looper.java:135) 04-21 10:11:31.208: E/AndroidRuntime(1665): at android.app.ActivityThread.main(ActivityThread.java:5257) 04-21 10:11:31.208: E/AndroidRuntime(1665): at java.lang.reflect.Method.invoke(Native Method) 04-21 10:11:31.208: E/AndroidRuntime(1665): at java.lang.reflect.Method.invoke(Method.java:372) 04-21 10:11:31.208: E/AndroidRuntime(1665): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 04-21 10:11:31.208: E/AndroidRuntime(1665): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 04-21 10:11:39.427: I/art(1665): Clamp target GC heap from 49MB to 48MB

推荐答案

是的,使用图像可能会导致内存溢出您的设备上。分配的内存从设备到不同的设备。

Yes, using images may cause outOfMemory on your device. The allocated memory differs from device to device.

两种方法:


  1. 使用LruCache类来优化内存使用和缓存

  1. Use LruCache class to optimize memory usage and caching

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

使用毕加索强大的图像下载和缓存库Android版

Use Picasso a powerful image downloading and caching library for Android

http://square.github.io/picasso/

这篇关于在从定制的getView()'的OutOfMemoryError“BaseAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆