我有一个活动,用户按下一个从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。我使用分配跟踪器仔细观察,有一条困扰我的行:
任何人都可以帮我弄清楚为什么会这样吗?据我所知,这是一个标准&#34;在Android中下载图像的方法。
答案 0 :(得分:0)
您可以从文件中制作中间位图。这需要大量的记忆。不要使用位图,而是将图像字节直接保存到文件中。您可能正在下载jpg文件。
只需创建一个循环,在其中从输入流中读取块并将其写入文件输出流。