2013-07-24 4 views
0

Я использую библиотеку itext для создания pdf изображений и текста. Следующий код работает нормально на 3 из 4 устройств, но на 4-м устройстве я получаю OutOfMemoryException. Код запускается внутри метода doinbackground AsyncTask, он проверяет вращение каждого файла jpg (каталог файлов с SD-карты) с использованием объекта bimtmap, измеряя ширину по высоте и поворачивая объект itext Image 90degrees, если это необходимо.Android itext pdf library OutOfMemoryError

 try { 

      Document document = new Document(); 
      PdfWriter.getInstance(document, new FileOutputStream(
        Environment.getExternalStorageDirectory() 
          + "/doc" + documentID + ".pdf")); 
      document.open(); 
      document.setMargins(0f, 0f, 0f, 0f); 
      document.add(new Paragraph(documentNameEt.getText().toString())); 
      document.add(new Paragraph(makeUserDeets())); 
      Bitmap b = null; 
      Image image = null; 
      Rectangle r = document.getPageSize(); 
      for (String d : paths[0]) { 
       Log.d("senddataobj", d); 
       image = Image.getInstance(d); 
       b = BitmapFactory.decodeFile(d); 
       if (b.getWidth() > b.getHeight()) { 
        image.setRotationDegrees(90); 
        Log.d(d, "rotating"); 
       } 
       b.recycle(); 
       image.scaleToFit(r.getWidth(), r.getHeight()); 
       document.add(image);     
      } 

      document.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

java.lang.RuntimeException: Произошла ошибка при выполнении doInBackground() в android.os.AsyncTask $ 3.done (AsyncTask.java:278) в java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) at java.util.concurrent.FutureTask.setException (FutureTask.java:124) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:307) at java.util.concurrent.FutureTask.run (FutureTask.java:137) в android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:208) в java.util.concurrent.ThreadP oolExecutor.runWorker (ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:569) at java.lang.Thread.run (Thread.java:856) Причиняется: java.lang.OutOfMemoryError на android.graphics.BitmapFactory.nativeDecodeStream (нативный метод) при android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:493) в android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:299) в android.graphics.BitmapFactory.decodeFile (BitmapFactory.java:324) в com.wake.snapshot.CreateDocumentActivity $ CreateAndSendPdf.doInBackground (CreateDocumentActivity.java:315) в com.wake.up.your.wealth. snapshot.CreateDocume ntActivity $ CreateAndSendPdf.doInBackground (CreateDocumentActivity.java:1) на android.os.AsyncTask $ 2.call (AsyncTask.java:264) на java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java.305). .. 5 более

+0

Насколько велики изображения (размеры)? Возможно, у вас действительно закончилась нехватка памяти. Рассматривали ли вы сборку изображения документа по изображению вместо того, чтобы хранить все в памяти? – dmon

+0

Спасибо, я использовал класс options для получения нулевого объекта растрового изображения с размерами, а затем использовал тусклые объекты в объекте options. – brux

ответ

1

Как вам нужен только размер растрового использования BitmapFactory с inJustDecodeBounds Option http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inJustDecodeBounds ... Она возвращает пустой Bitmap, но вы будете иметь размер в outHeight и outWidth

+0

ОК, я добавил этот код, должен ли я также перерабатывать растровый объект? – brux

+0

Нет ... Растровое изображение будет пустым, и вы получите размер от полей options.outxxxx ... используйте 'em вместо b.getxxxx() – Selvin

+0

Хорошо, спасибо, что я тестировал этот метод – brux