2012-01-04 17 views
1
HttpResponse responseGet; 
     try { 
      responseGet = client.execute(get); 
      switch (responseGet.getStatusLine().getStatusCode()) { 
      case 200: 
       File SDCardRoot = Environment.getExternalStorageDirectory(); 
       File directory = new File(SDCardRoot 
         + "/OfflineDocuments/" 
         + (document.getPath() == null ? "" 
           : (document.getPath() + "/"))); 
       directory.mkdirs(); 
       File file = new File(directory, fileName); 
       InputStream is = responseGet.getEntity().getContent(); 
       BufferedInputStream bis = new BufferedInputStream(is); 

       ByteArrayBuffer baf = new ByteArrayBuffer(50); 
       int current = 0; 
       while ((current = bis.read()) != -1) { 
        baf.append((byte) current); 
       } 

       FileOutputStream fos = new FileOutputStream(file); 
       fos.write(baf.toByteArray()); 
       fos.close(); 
       break; 

      default: 
       Log.e("Statuscode", "Unexpected status code: " 
         + responseGet.getStatusLine().getStatusCode()); 
       break; 
      } 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 

これは小さな文書でも機能します。しかし、数MBを超える文書の場合、このコードは "OutOfMemoryException"でクラッシュします。何か案が?ファイルをダウンロードするときにメモリが不足する

答えて

1

ファイル全体をメモリにスラッシングして、そのバッファされたファイルをストレージに書き出します。代わりに、バッファリングをスキップして、彼らがでてくるような記憶に作品を書く。

FileOutputStream fos = new FileOutputStream(file); 
while ((current = bis.read()) != -1) { 
    fos.write(current); 
} 
fos.close(); 

そうノート...ないAndroidデベロッパー、ないアイデアを、これは実際に動作するので、疑似コードとしてこれを扱うならば。

+0

解決策は、すべての1バイトが書き込まれるため、アプリの実行を非常に困難にします。私はそのように変更しました.1MBを要約して一度に書き出し、再び1MBのキャッシュを開始します。完璧に動作します。 –

0

ファイル全体をメモリに読み込もうとしているだけで、JVMのメモリが不足しています。おそらく、バッファに追加するのではなく、whileループ内のファイルに書き込むことをお勧めします。

関連する問題