Android应用程序中的内存泄漏使用AsyncTask下载文件



我在使用 AsyncTask 类时遇到了明显的内存泄漏问题。下面的 Android 类旨在从 http 下载图像并将其存储到成员变量 "Drawable bgImageDrawable" 中。开始下载过程的函数是 downloadBackgroundImage() 。运行此操作后,似乎每次已用内存大小都会增加 8MB。我正在下载一个 800KB 的 jpeg 图像文件,但我不确定为什么内存显着增加。下面的代码有问题吗?

public class Example 
{
    private URL bgImageUrl;
    private Drawable bgImageDrawable;
    public Example(String bg)   {
        try {
            this.setBgImageUrl(new URL(bg));
        } 
        catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    public Drawable drawableFromUrl(String url, String srcName) throws java.net.MalformedURLException, java.io.IOException  {
        return Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()), srcName);
    }
    public void downloadBackgroundImage()    {
        new DownloadFilesTask().execute(getBgImageUrl().toString());
    }
    public void setBgImageDrawable(Drawable bgImageDrawable) {
        this.bgImageDrawable = bgImageDrawable;
    }
    public URL getBgImageUrl() {
        return bgImageUrl;
    }
    public void setBgImageUrl(URL bgImageUrl) {
        this.bgImageUrl = bgImageUrl;
    }
    /* The purpose of this class is to download a file asynchronously. */
    private class DownloadFilesTask extends AsyncTask<String, Integer, Drawable> 
    {
        protected Drawable doInBackground(String... s)       {
            Drawable bgImage = null;
              try  {
                    bgImage = drawableFromUrl(s[0], "src name");
                    return bgImage;
              } 
              catch (MalformedURLException e)             {
                    e.printStackTrace();
              } 
              catch (IOException e)               {
                    e.printStackTrace();
              }
            return bgImage;
         }
         protected void onProgressUpdate(Integer... progress)        {
         }
         protected void onPostExecute(Drawable result)       {
             setBgImageDrawable(result);
         }
     }
}

将 800KB 的 jpeg 转换为可绘制对象。下载解码为位图后的 jpeg。位图包装在可绘制对象中。因此,800KB jpeg 的解码位图需要 8MB 是可以的。

您可以使用探查器查看究竟是什么占用了这么多内存。恕我直言,这是一个可绘制的。

最新更新