Java 如何在活动退出之前释放分配给drawables的内存? 公共类页面活动扩展活动{ 私有整数=31; 私有TouchImageView[]imageViews=新建TouchImageView[numPages]; 专用字符串URL=”http://www.smbc-comics.com/comics/201108"; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ViewPager ViewPager=新的ViewPager(此); 对于(int i=0;i

Java 如何在活动退出之前释放分配给drawables的内存? 公共类页面活动扩展活动{ 私有整数=31; 私有TouchImageView[]imageViews=新建TouchImageView[numPages]; 专用字符串URL=”http://www.smbc-comics.com/comics/201108"; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ViewPager ViewPager=新的ViewPager(此); 对于(int i=0;i,java,android,Java,Android,} 我正在尝试创建一个图像查看器,它可以从给定的URL加载图像 用于在单个图像上进行触摸处理的TouchImageView ViewPager和PageAdapter可让用户移动到下一页 Asyn任务在页面实例化时下载图像 当我下载了一些图片后,应用程序崩溃了。我从DDMS/MAT检查图像的位图是否未被释放。这是因为我正在销毁的视图没有被GC收集,因为它们仍然在某个地方被引用 我想知道在这种情况下,他们是否有明确释放内存的方法?我尝试从代码中删除所有引用,但仍然无法释放内存 PS:请原谅我先

}

我正在尝试创建一个图像查看器,它可以从给定的URL加载图像

  • 用于在单个图像上进行触摸处理的TouchImageView
  • ViewPager和PageAdapter可让用户移动到下一页
  • Asyn任务在页面实例化时下载图像
当我下载了一些图片后,应用程序崩溃了。我从DDMS/MAT检查图像的位图是否未被释放。这是因为我正在销毁的视图没有被GC收集,因为它们仍然在某个地方被引用

我想知道在这种情况下,他们是否有明确释放内存的方法?我尝试从代码中删除所有引用,但仍然无法释放内存


PS:请原谅我先把代码放上去,我试着把它下移,但格式弄乱了。

您不需要保留一个
ImageFetcher任务数组。通过执行此操作,您可以维护对已加载的绘图表的引用。尝试从代码中删除数组。
AsyncTask
s将运行到完成,您无需维护对它们的引用。

您无需保留
ImageFetcher
任务数组。通过执行此操作,您可以维护对已加载的绘图表的引用。尝试从代码中删除数组。
AsyncTask
s将一直运行到完成,您无需维护对它们的引用。

感谢您的回答,是的,它在没有数组的情况下工作正常,但从DDMS中,我仍然看到内存以相同的模式增加,一旦超过堆限制,最终会导致崩溃。我现在将更新问题中的代码,以显示状态。@ManikMahajan-好吧,就像你用一个
TouchImageView
数组来设置一样,每个数组都有一个可绘制的,它将尝试在内存中保留所有加载的图像。你真的需要31个
TouchImageView
对象吗?也许你可以重复使用一个?我需要至少3个,以便允许翻页,有没有一种方法,我可以在destroyItem中释放旧的?我尝试添加imageViews[position]。removeCallbacks(null);但仍然不会影响内存使用。@ManikMahajan-您可以尝试调用
setImageDrawable(null)
。谢谢您的回答,是的,它在没有数组的情况下也能工作,但从DDMS中,我仍然看到内存以相同的模式增加,一旦超过堆限制,最终会导致崩溃。我现在将更新问题中的代码,以显示状态。@ManikMahajan-好吧,就像你用一个
TouchImageView
数组来设置一样,每个数组都有一个可绘制的,它将尝试在内存中保留所有加载的图像。你真的需要31个
TouchImageView
对象吗?也许你可以重复使用一个?我需要至少3个,以便允许翻页,有没有一种方法,我可以在destroyItem中释放旧的?我尝试添加imageViews[position]。removeCallbacks(null);但仍然不会影响内存使用。@ManikMahajan-您可以尝试调用
setImageDrawable(null)
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;
    }

}