Java 使用ImageGetter从HTML获取图像时出现内存不足错误

Java 使用ImageGetter从HTML获取图像时出现内存不足错误,java,android,memory,bitmap,universal-image-loader,Java,Android,Memory,Bitmap,Universal Image Loader,我正在编写一个应用程序来显示来自网站的帖子,并使用Html.fromHtml来实现这一点。但是,如果我打开一篇文章,它会立即使用大约25MB的内存来加载图像。即使图像存储在设备上,也只有重新加载相同的文章会导致另一个25MB跳转,这是可以接受的。我环顾四周,尝试了大量的解决方案。我觉得我需要回收位图,只是我不知道该在哪里做。代码如下: public class ImageGetter implements Html.ImageGetter { private Context c; private

我正在编写一个应用程序来显示来自网站的帖子,并使用
Html.fromHtml
来实现这一点。但是,如果我打开一篇文章,它会立即使用大约25MB的内存来加载图像。即使图像存储在设备上,也只有重新加载相同的文章会导致另一个25MB跳转,这是可以接受的。我环顾四周,尝试了大量的解决方案。我觉得我需要回收位图,只是我不知道该在哪里做。代码如下:

public class ImageGetter implements Html.ImageGetter {
private Context c;
private TextView container;
private ImageLoader imageLoader;
private DisplayImageOptions options;
private UrlImageDownloader urlDrawable;

public ImageGetter(View t, Context c) {
    this.c = c;
    this.container = (TextView)t;

    imageLoader = ImageLoader.getInstance();
    options = new DisplayImageOptions.Builder().cacheOnDisk(true).cacheInMemory(false).imageScaleType(ImageScaleType.EXACTLY)
            .showImageOnLoading(R.color.darkcolorPrimary).bitmapConfig(Bitmap.Config.RGB_565).resetViewBeforeLoading(true).build();
}

@Override
public Drawable getDrawable(String source) {
    urlDrawable = new UrlImageDownloader(c.getResources(), source);
    imageLoader.loadImage(source, options, new SimpleListener(urlDrawable));
    return urlDrawable;
}

private class SimpleListener extends SimpleImageLoadingListener
{
    UrlImageDownloader urlImageDownloader;

    public SimpleListener(UrlImageDownloader downloader) {
        super();
        urlImageDownloader = downloader;
    }

    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        int width = loadedImage.getWidth();
        int height = loadedImage.getHeight();

        int newWidth = width;
        int newHeight = height;

        if( width > container.getWidth() ) {
            newWidth = container.getWidth();
            newHeight = (newWidth * height) / width;
        }

        Drawable result = new BitmapDrawable(c.getResources(), loadedImage);
        result.setBounds(0, 0, newWidth, newHeight);

        urlImageDownloader.setBounds(0, 0, newWidth, newHeight);
        urlImageDownloader.drawable = result;

        container.setText(container.getText());
    }
}

public class UrlImageDownloader extends BitmapDrawable
{
    public Drawable drawable;

    /**
     * Create a drawable by decoding a bitmap from the given input stream.
     *
     * @param res
     * @param is
     */
    public UrlImageDownloader(Resources res, InputStream is) {
        super(res, is);
    }

    /**
     * Create a drawable by opening a given file path and decoding the bitmap.
     *
     * @param res
     * @param filepath
     */
    public UrlImageDownloader(Resources res, String filepath) {
        super(res, filepath);
        drawable = new BitmapDrawable(res, filepath);
    }

    /**
     * Create drawable from a bitmap, setting initial target density based on
     * the display metrics of the resources.
     *
     * @param res
     * @param bitmap
     */
    public UrlImageDownloader(Resources res, Bitmap bitmap) {
        super(res, bitmap);
    }

    @Override
    public void draw(Canvas canvas) {
        // override the draw to facilitate refresh function later
        if(drawable != null) {
            drawable.draw(canvas);
        }
    }
}

}

您可以通过调用位图上的
回收方法来删除位图。

但是,单靠它本身并没有多大作用,您应该通过调用
System.gc()
来调用垃圾收集器,垃圾收集器将从内存中清除垃圾。

解决了这个问题。存储图像的
TextView
内存泄漏。如果您遇到这样的问题,我建议您使用Eclipse MAT来识别内存泄漏。

是的,我已经尝试调用垃圾收集器,它的影响很小,我觉得位图的引用被保存在我无法理解的地方。以下是您应该尝试的:在android studio中打开内存监视器并加载位图,加载另一个并启动内存中的GC监视器。如果内存使用率没有降低,那么就有泄漏。如果是这样,你在错误的地方调用垃圾收集器是的,它不会减少。我有个漏洞,我就是不知道它在哪里。