gpt4 book ai didi

java - Android 应用程序使用 AsyncTask 下载文件时出现内存泄漏

转载 作者:行者123 更新时间:2023-12-01 12:17:33 25 4
gpt4 key购买 nike

我在使用 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 已解码为位图。位图被包装在 Drawable 内部。所以 800KB jpeg 的解码位图占用 8MB 是可以的。

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

关于java - Android 应用程序使用 AsyncTask 下载文件时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26899169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com