我在使用 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 是可以的。
您可以使用探查器查看究竟是什么占用了这么多内存。恕我直言,这是一个可绘制的。