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

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 に答える
0

また、大きな画像をロードしようとすると、メソッドがOutOfMemoryExceptionのエラーになりやすいと思います。これを修正するには、メモリに割り当てる前にビットマップを縮小する必要があります。

効率が本当に気になる場合は、この記事をお読みください: http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-07-06T08:29:30.293 に答える