毕加索的内存不足

时间:2015-07-10 07:11:28

标签: android out-of-memory

我正在使用picasso库从服务器上加载网格上的多个图像。 我在主活动上有三个片段。每个片段使用毕加索从服务器加载网格上的多个图像。当我连续地从片段导航到片段时,片段加载缓慢,然后半小时应用程序因毕加索的内存不足错误而崩溃。如何解决?

public class MyAlbImageAdapter extends BaseAdapter {

    public List<MyAlbum> _albumList=AppController.getInstance().getPrefManger().getMyAlbums();
    public static int flag=0;
    private LayoutInflater inflater;

    private DisplayImageOptions options;
    ImageLoaderConfiguration config;
    ImageLoader imageLoader;
    Context c;
    public MyAlbImageAdapter(Context context,List<MyAlbum> album) 
    {
         _albumList=album;
         inflater = LayoutInflater.from(context);
         this.c=context;

    }

    @Override
    public int getCount() {
        return _albumList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    // Create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;      
        final ViewHolder holder;
        if(v == null)
        {
           v = inflater.inflate(R.layout.myalb_outer_griditem, parent, false);
           holder = new ViewHolder();
           holder.imageView = (ImageView) v.findViewById(R.id.thumbnail);
           holder.t1 = (TextView) v.findViewById(R.id.alb_name);
           holder.t2 = (TextView) v.findViewById(R.id.usr_name);
           v.setTag(holder);
        }
        else 
        {
            holder = (ViewHolder) v.getTag();
        }
        MyAlbum p = _albumList.get(position);           
        holder.t1.setText(p.getName());


        Picasso.with(c).load(AppConst.BASE_IMAGE_URL+p.getCover()).fit().centerCrop().into(holder.imageView);       


return v;}}

请帮助,我在网上尝试了很多链接,但没有找到任何有用的东西。

错误是:

07-10 12:40:46.230: E/dalvikvm(17680): Out of memory: Heap Size=131107KB, Allocated=129839KB, Limit=65536KB 07-10 12:40:46.240: E/dalvikvm(17680): Extra info: Footprint=131043KB, Allowed Footprint=131107KB, Trimmed=1452KB 07-10 12:40:46.240: E/Bitmap_JNI(17680): Create Bitmap Failed. 07-10 12:40:46.240: E/Bitmap_JNI(17680): Failed to create SkBitmap! 07-10 12:40:48.012: E/dalvikvm-heap(17680): Out of memory on a 198896-byte allocation.

2 个答案:

答案 0 :(得分:3)

类似的问题。 Android Picasso ImageView - Out of Memory Exception MemoryLeak

当Android“展开”您的图像(即将其解码为位图)时,每个像素将使用4个字节。计算像素数,将其乘以4再乘以20(图像数量),您可能会接近100mb的数字。例如,如果您的图像具有1,000,000像素分辨率,那么它将是1,000,000 x 4 x 20 = 80mb。

使用某种LRU缓存或类似物(或者使用Universal Image Loader库来处理缓存),只在需要时加载位图。

答案 1 :(得分:1)

从Facebook试用Fresco库。早些时候,我还使用 Picasso 并且用于获取OOM错误,因为分配给应用程序的堆大小非常小,并且如果要加载大尺寸的图像,则很快就会变满。 Fresco使用 ashmen缓存,允许缓存更多数据。它还可以选择缩减图像和渐进加载的JPEG。自从我改用Fresco以来,我没有遇到任何OOM问题。试试吧。另外,尝试使用 OkHttp 作为网络库。它提供了http缓存,这也可能有所帮助。另外,启用@codephillip编写的 largeHeap 。这也有点帮助。