2015-10-20 24 views
0

我有一个使用ViewPager的图像查看器。每个片段上都有一个大的图像。这一段时间运行良好,但在足够的图像后,应用程序内存不足。如何在ViewPager片段中处理图像回收?

为了解决这个问题,我试图回收的位图,但这会导致另一个问题:如果我刷回,回收的位图引起RuntimeException

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 

片段代码如下所示:

Bitmap m_image = null; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    View root = inflater.inflate(R.layout.fragment_image, container, false); 

    final ImageView img = (ImageView)root.findViewById(R.id.ivImage); 
    img.setVisibility(View.GONE); 

    Picasso.with(getContext()) 
      .load(getArguments().getString("url")) 
      .into(new Target() 
      { 
       @Override 
       public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) 
       { 
        m_image = bitmap; 
        img.setImageBitmap(m_image); 
        img.setVisibility(View.VISIBLE); 
       } 

       @Override 
       public void onBitmapFailed(Drawable errorDrawable) 
       { 
       } 

       @Override 
       public void onPrepareLoad(Drawable placeHolderDrawable) 
       { 
       } 
      }); 

    return root; 
} 

@Override 
public void onDestroyView() 
{ 
    if(m_image != null) 
    { 
     m_image.recycle(); 
     m_image = null; 
    } 
    super.onDestroyView(); 
} 

和保持该ViewPager活动如下:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_image); 

    final DataHandler dataHandler = getApp().getDataHandler(); 

    PagerAdapter adapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) 
    { 
     @Override 
     public Fragment getItem(int position) 
     { 
      Entry e = dataHandler.get(position); 
      Fragment f = new ImageFragment(); 
      Bundle args = new Bundle(); 
      args.putString("url", e.getURL()); 
      f.setArguments(args); 
      return f; 
     } 

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

    ViewPager pager = (ViewPager)findViewById(R.id.vpImages); 
    pager.setAdapter(adapter); 
} 

回答

1

使用毕加索时,您无需处理内存。如果碎片被GCed处理,ImageView将负责回收与之相关的位图。

虽然有几个建议:

  • 如果在您的项目中添加OkHttp作为依赖,毕加索将自动地添加网络缓存。缓存的图像加载速度更快,数据消耗更少。

  • 要只使用您需要的内存,我会调整图像大小以匹配ImageView大小。要做到这一点,使用: Picasso.with(context).fit().centerCrop().into(imageView);

+0

啊,我还以为它会,但似乎早些时候,我用不同的方法,其中片段不正确销毁视图分页。之后,出现了导致内存不足错误的特大图像。调整图像大小完美。谢谢! – manabreak