使用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);
}
}
}
答案 0 :(得分:1)
您将800KB jpeg转换为drawable。下载后你的jpeg解码为位图。并且位图包含在Drawable中。所以800KB jpeg的解码位图需要8MB才可以。
您可以使用分析器来查看究竟占用了多少内存。恕我直言,它是一个可绘制的。
答案 1 :(得分:0)
导致任务延长的原因
为此,我建议您使用Service或IntentService。