2012-01-04 3 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(); 
     } 

Это работает для небольших документов. Но для документов размером более нескольких МБ этот код выходит из строя с «OutOfMemoryException». Есть идеи?Недостаточно памяти при загрузке файла

ответ

1

Вы полностью заполняете файл в памяти, а затем записываете этот буферный файл в хранилище. Вместо этого, пропустите буферизацию и писать куски на хранение, как они приходят в.

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

сведению ... не андроид разработчик, так что не знаю, если это будет на самом деле работает, так что относиться к этому как псевдо-код.

+0

Ваше решение замедляет приложение очень сложно, потому что записывается каждый байт. Я изменил его таким образом, что я суммирую 1 МБ, пишу сразу и начинаю снова кэшировать 1 МБ. Работает отлично. –

0

Вы просто пытаетесь прочитать весь файл в памяти, а на вашем JVM недостаточно памяти. Вероятно, вы захотите записать файл внутри цикла while, а не добавлять его в буфер.

Смежные вопросы