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

时间:2014-11-13 00:17:27

标签: java android memory-leaks 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);
         }
     }
}

2 个答案:

答案 0 :(得分:1)

您将800KB jpeg转换为drawable。下载后你的jpeg解码为位图。并且位图包含在Drawable中。所以800KB jpeg的解码位图需要8MB才可以。

您可以使用分析器来查看究竟占用了多少内存。恕我直言,它是一个可绘制的。

答案 1 :(得分:0)

导致任务延长的原因

  1. 仅在没有其他选择的情况下使用“活动”上下文 允许在范围大于的范围内引用它 它引用的活动范围。
  2. Android应用程序框架提供了许多专门设计的类 使开发人员更容易使用后台线程。例如, 考虑使用服务或Synadapter而不是 thread / Asyntask / Loader用于执行长期异步 后台查询与Activity生命周期结合使用。
  3. 为此,我建议您使用Service或IntentService。