在内存使用方面是否有更有效的方法 和表现。以下方法下载位图和调用 一个有进步的功能。
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
URLConnection connection = url.openConnection();
connection.connect();
int fileLength = connection.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
if(imageInterface != null) {
imageInterface.duringDownload(
imageView, ((int)total * 100 / fileLength));
}
outputStream.write(data, 0, count);
}
byte[] byteArray = outputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
input.close();
outputStream.flush();
outputStream.close();
return bitmap;
答案 0 :(得分:2)
您的耗时任务不应在UI线程上运行。使用AsyncTask
并从onProgressUpdate
方法更新用户界面。
增加铲斗尺寸。目前,您一次读取1024个字节的块,并在每次读取后更新UI。例如,对于1MB图像,您可以刷新UI 1024次。这是低效的,所以如果你增加缓冲区大小,你需要做更少的UI刷新:
byte data[] = new byte[100 * 1024];
答案 1 :(得分:0)
此外,如果尝试加载大图片,我相信您的方法容易出错 OutOfMemoryException 。要解决此问题,您需要在将位图分配到内存之前缩小位图。
如果您真的关心效率,请阅读本文:http://developer.android.com/training/displaying-bitmaps/index.html
答案 2 :(得分:0)
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
// Do not update UI here, only do downloading in background.
protected Long doInBackground(URL... urls) {
while (...) {
// do input.read() and outputStream.write() just like in your original code
// Use AsyncTask method to publish progress
publishProgress((int)total * 100 / fileLength);
}
}
// Here is where you use the progress value to update UI.
protected void onProgressUpdate(Integer... progress) {
imageInterface.duringDownload(
imageView, progress[0]);
}
}