从URL下载图像时分配大量内存

时间:2016-03-07 15:33:28

标签: android android-image

我有一个活动,用户按下一个从URL获取JSON响应的按钮,然后下载并保存该JSON中的所有图像URL。下载发生在一个单独的类中,该类扩展了Thread

downloadButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        DownloadTask task = new DownloadTask(handler);
        task.start();
    }
});

handler是一个内部静态Handler,它为活动保存WeakReference(用于显示进度)。

DownloadTask

public DownloadTask(Handler handler) {
    this.handler = handler;
}

@Override
public void run() {
    String jsonString = // gets JSON from server

    urlsToDownload = new HashSet<String>();

    // do some stuff with the JSON to put each URL into the Set

    for (Iterator<String> i = urlsToDownload.iterator(); i.hasNext(); ) {
        String urlString = i.next();

        // the following takes place in two static method calls,
        // but I've laid it all out here for easier interpretation.
        // I'm also removing all try/catch blocks, if (x != null) checks etc

        // first download the image from the web
        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.connect();

        BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
        Bitmap bitmap = BitmapFactory.decodeStream(bis);
        bis.close() // (done in try-with-resource)
        connection.disconnect();

        // then save the image on the device
        File file = new File(App.context.getFilesDir(), "my/file/name.jpg");
        FileOutputStream fos = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
        fos.close() // (done in try-with-resource)

        // make a Bundle, add some progress info and send it in a Message
        handler.handleMessage(msg);
    }
}

我的问题是这是使用非常大量的内存。在Android Studio中查看内存监视器时,下载/保存每个图像(~1.7MB)时最高可达~95MB。我使用分配跟踪器仔细观察,有一条困扰我的行:

(there are 6 images being downloaded)

任何人都可以帮我弄清楚为什么会这样吗?据我所知,这是一个标准&#34;在Android中下载图像的方法。

1 个答案:

答案 0 :(得分:0)

您可以从文件中制作中间位图。这需要大量的记忆。不要使用位图,而是将图像字节直接保存到文件中。您可能正在下载jpg文件。

只需创建一个循环,在其中从输入流中读取块并将其写入文件输出流。