0

我正在使用 itext 库来创建图像和文本的 pdf。以下代码在 4 台设备中的 3 台上运行良好,但在第 4 台设备上出现 OutOfMemoryException。该代码在 AsyncTask doinbackground 方法中运行,它使用 bimtmap 对象检查每个 jpg 文件(来自 sdcard 的文件目录)的旋转,测量宽度与高度,并在必要时将 itext Image 对象旋转 90 度。

        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:在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 的 android.os.AsyncTask$3.done(AsyncTask.java:278) 处执行 doInBackground() 时发生错误java.util.concurrent.FutureTask.setException(FutureTask.java:124) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 在 java.util.concurrent.FutureTask.run(FutureTask.java: 137) 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) 原因:android.graphics.BitmapFactory.nativeDecodeStream(Native Method) at android.graphics.BitmapFactory 的 java.lang.OutOfMemoryError。decodeStream(BitmapFactory.java:493) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324) at com.wake.snapshot.CreateDocumentActivity$CreateAndSendPdf.doInBackground (CreateDocumentActivity.java:315) at com.wake.up.your.wealth.snapshot.CreateDocumentActivity$CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:264) at java .util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) ... 还有 5 个snapshot.CreateDocumentActivity$CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:264) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 。 .. 还有 5 个snapshot.CreateDocumentActivity$CreateAndSendPdf.doInBackground(CreateDocumentActivity.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:264) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 。 .. 还有 5 个

4

1 回答 1

1

因为您只需要位图的大小,请使用带有 inJustDecodeBounds 选项的 BitmapFactory http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inJustDecodeBounds ...它将返回空位图,但您将有大小in outHeight 和 outWidth

于 2013-07-24T00:35:28.703 回答