java - 如何在 Activity 退出之前释放分配给可绘制对象的内存?

标签 java android

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;
    }

}

}

我正在尝试创建一个图像查看器,它可以从给定的 URL 加载图像。上面的代码使用

实现此功能
  • TouchImageView 用于对单个图像进行触摸处理。
  • ViewPager 和 PageAdapter 让用户移至下一页。
  • 实例化页面时下载图像的 Asyn 任务。

当我下载一些图像时,应用程序崩溃了。我从 DDMS/MAT 检查到图像的位图没有被释放。这是因为我正在销毁的 View 没有被 GC 收集,因为它们仍在某处被引用。

我想知道在这种情况下是否有某种方法可以显式释放内存?我尝试从代码中删除所有引用,但它仍然没有释放内存。

PS:请原谅我先贴出代码,我试图将其向下移动,但格式困惑了。

最佳答案

您无需保留 ImageFetcher 任务数组。通过这样做,您可以维护对加载的可绘制对象的引用。尝试从代码中删除该数组。 AsyncTask 将运行直至完成,而无需维护对它们的引用。

关于java - 如何在 Activity 退出之前释放分配给可绘制对象的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15911570/

相关文章:

Android Wear生成两个apk

java - 为什么我的 SaxParser 在解析本地文件时会抛出 ConnectException?

java - 静态数据使用SoftReference防止Java内存不足

java - 如何从 Google map android 中删除所有半径圆但保留钉子?

android - IBM 工作灯 : Integrating server generated pages in app

android - 如何导入 com.google.android.maps.MapActivity?

android - 授予应用程序root权限

java - 将 HashMap 转换为数组

java - 在 PHP 代码中运行 Java 程序

android - Samsung Galaxy 设备无法使用 geolocation.getCurrentPosition