正在下载文件进度。这是正确的做法吗?

时间:2012-07-06 08:00:01

标签: android inputstream

在内存使用方面是否有更有效的方法 和表现。以下方法下载位图和调用 一个有进步的功能。

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;

3 个答案:

答案 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)

执行与AsyncTask documentation

中给出的示例类似的操作
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]);

 }
}