2013-04-09 22 views
0
public class PageActivity extends Activity { 
private int numPages = 31; 
private TouchImageView[] imageViews = new TouchImageView[numPages]; 
private String URL = "http://www.smbc-comics.com/comics/201108"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ViewPager viewPager = new ViewPager(this); 

    for (int i = 0; i < numPages; i++) { 
     imageViews[i] = new TouchImageView(this); 
     imageViews[i].setBackgroundResource(R.drawable.blank); 
     imageViews[i].setMaxZoom(4f); 
    } 

    setContentView(viewPager); 
    ImagePagerAdapter adapter = new ImagePagerAdapter(); 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(2); 
} 


private class ImagePagerAdapter extends PagerAdapter { 
    @Override 
    public int getCount() { 
     return numPages; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == ((TouchImageView) object); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Context context = PageActivity.this; 

     String pageURL = URL; 

     if (imageViews[position].getDrawable() == null) { 
      ImageFetcher imagefetcher = new ImageFetcher(); 
      imagefetcher.execute(
        pageURL + String.format("%02d", position+1) + ".gif", 
        String.valueOf(position+1)); 
     } 


     ((ViewPager) container).addView(imageViews[position], 0); 
     return imageViews[position]; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 

     ((ViewPager) container).removeView((TouchImageView) object); 
        imageViews[position].removeCallbacks(null); 

    } 

} 
public class ImageFetcher extends AsyncTask<String, Integer, Drawable> { 
    int fillthisPos; 

    public Drawable doInBackground(String... urls) { 
     try { 
      InputStream is = (InputStream) new URL(urls[0]).getContent(); 
      fillthisPos = Integer.parseInt(urls[1]); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(Drawable result) { 
     super.onPostExecute(result); 
     imageViews[fillthisPos].setImageDrawable(result); 
     result = null; 
    } 

} 

}如何在活动退出之前释放分配给drawables的内存?

我试图创建一个图像浏览器可从给定的代码URLs.The加载图像上面实现此使用

  • TouchImageView用于触摸处理单个图像上。
  • ViewPager和PageAdapter让用户移动到下一页。
  • Asyn任务在页面实例化时下载图像。

当我下载了一些图像,应用程序崩溃。我从DDMS/MAT中检查出图像的Bitmaps没有被释放。这是因为我摧毁的观点没有被GC收集,因为它们仍然在某处被引用。

我想知道他们是否有某种方法可以在这种情况下明确释放内存?我试图从我的代码中删除所有引用,但它仍然不释放内存。附注:请原谅我的代码第一,我试图把它移下来,但格式化搞砸了。

回答

1

您无需保留一组ImageFetcher任务。通过这样做,您可以保持对加载的绘图的引用。尝试从代码中删除数组。 AsyncTask将运行完成,而不需要保持对它们的引用。

+0

感谢您的回答,是的,它没有数组的工作,但从DDMS我仍然看到内存增加相同的模式,最终导致崩溃一旦堆限制越过。我会更新我的问题代码现在显示stiuation。 – 2013-04-09 20:23:19

+0

@ManikMahajan - 好吧,你已经用一个'TouchImageView'数组来设置事物,每个都有一个drawable,它会尝试将所有加载的图像保留在内存中。你真的需要31个'TouchImageView'对象吗?也许你可以重复使用一个? – 2013-04-09 20:30:20

+0

我需要atleast 3以允许页面翻转,有没有办法我可以释放destroyItem中的旧的?我试图添加imageViews [position] .removeCallbacks(null);但仍不会影响内存使用情况。 – 2013-04-09 20:49:00