0

在内存使用和性能方面是否有更有效的方法来做到这一点。以下方法下载位图并使用进度调用函数。

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;
4

3 回答 3

2

您的耗时任务不应在 UI 线程上运行。使用并从 on方法AsyncTask更新 UI 。onProgressUpdate

增加您的存储桶大小。目前,您一次读取 1024 字节块并在每次读取后更新 UI。例如,对于 1MB 的图像,您会刷新 UI 1024 次。这是低效的,所以如果你增加缓冲区大小,你需要做更少的 UI 刷新:

byte data[] = new byte[100 * 1024];
于 2012-07-06T08:07:13.977 回答
0

另外,我相信如果您的方法尝试加载大图像,则容易出错OutOfMemoryException 。要解决此问题,您需要先按比例缩小位图,然后再将其分配到内存中。

如果您真的关心效率,请阅读这篇文章:http: //developer.android.com/training/displaying-bitmaps/index.html

于 2012-07-06T08:29:30.293 回答
0

执行类似于AsyncTask 文档中给出的示例的操作:

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]);

 }
}
于 2013-02-15T00:13:03.283 回答