我正在创建一个应用程序,用于从服务器下载图像并在ListView中显示。我遇到的问题是内存泄漏,导致我的应用程序崩溃。我在 Android 博客中搜索了一些文章,例如 此链接,它提供了一个很好的想法,但仍然不能够在多个线程中使用。一些 Android 设备可以处理它,但有些设备只能在单个线程中处理,有时根本无法工作。
我的应用程序有许多活动,每个活动都有一个需要尽可能快速地显示图像的 ListView。通过 Google IO 2012,他们使用缓冲区将原始图像保存到 SD 卡中,并解决了内存泄漏的问题,但由于需要下载的图像太大,加载速度太慢。
我的问题是:有没有办法将图像缩放并将其写入SD卡?我找到了一些可能的解决方案,如在 inputstream 对象中使用 Skip byte,我还能够找到需要下载的图像的宽度、高度和每像素位数。
以下代码在 Google IO 2012 中使用,可以很好地支持多线程,在我的情况下,我有四个线程在后台运行。
我的应用程序有许多活动,每个活动都有一个需要尽可能快速地显示图像的 ListView。通过 Google IO 2012,他们使用缓冲区将原始图像保存到 SD 卡中,并解决了内存泄漏的问题,但由于需要下载的图像太大,加载速度太慢。
我的问题是:有没有办法将图像缩放并将其写入SD卡?我找到了一些可能的解决方案,如在 inputstream 对象中使用 Skip byte,我还能够找到需要下载的图像的宽度、高度和每像素位数。
以下代码在 Google IO 2012 中使用,可以很好地支持多线程,在我的情况下,我有四个线程在后台运行。
private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
BufferedOutputStream out = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoInput(true);
conn.connect();
final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB
out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
out.close();
conn.disconnect();
}
catch (Exception e) {
Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
file.delete();
}
}