首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >runOnUiThread和Flir One SDK出现OutOfMemory错误

runOnUiThread和Flir One SDK出现OutOfMemory错误
EN

Stack Overflow用户
提问于 2017-07-15 10:17:02
回答 1查看 169关注 0票数 0

我正在尝试保存在FrameProcessor.Delegate.onFrameProcessed上收到的帧。

如果我试图在使用renderedImage.getFrame().save(...)的线程中使用runOnUiThread,我会得到以下异常:

代码语言:javascript
复制
AndroidRuntime: Error reporting crash
java.lang.OutOfMemoryError: Failed to allocate a 25235166 byte allocation with 16777216 free bytes and 20MB until OOM
    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
    at java.lang.StringBuffer.append(StringBuffer.java:278)
    at java.io.StringWriter.write(StringWriter.java:123)
    at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
    at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
    at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
    at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
    at java.io.PrintWriter.append(PrintWriter.java:691)
    at java.io.PrintWriter.append(PrintWriter.java:687)
    at java.io.Writer.append(Writer.java:198)
    at java.lang.Throwable.printStackTrace(Throwable.java:324)
    at java.lang.Throwable.printStackTrace(Throwable.java:300)
    at android.util.Log.getStackTraceString(Log.java:527)
    at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:61)
    at com.android.internal.os.RuntimeInit.-wrap0(RuntimeInit.java)
    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:86)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)

这是执行原始线程的方法:

代码语言:javascript
复制
private FrameProcessor.Delegate frameProcessorDelegate = new FrameProcessor.Delegate() {
    @Override
    public void onFrameProcessed(final RenderedImage renderedImage) {
        //Capture this image if requested
        if (imageCaptureRequested) {
            imageCaptureRequested = false;
            setProgressVisibility(VISIBLE);

            new Thread(new Runnable() {
                public void run() {
                    String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd-HHmmss", Locale.getDefault());
                    String formatedDate = sdf.format(new Date());
                    String fileName = formatedDate + ".jpg";
                    try {
                        lastSavedPath = path + "/" + fileName;

                        renderedImage.getFrame().save(new File(lastSavedPath), RenderedImage.Palette.Iron, RenderedImage.ImageType.BlendedMSXRGBA8888Image);

                        toggleConfirmPhotoScreen(true, lastSavedPath);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
};

使用runOnUiThread的方法:

代码语言:javascript
复制
private void toggleConfirmPhotoScreen(final boolean show, final String lastSavedPath) {
    //works until here
    Log.d("ExampleApp", "toggleConfirmPhotoScreen");
    ((Activity) getContext()).runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //NEVER REACHES HERE
            Log.d("ExampleApp", "        " + show + " CancelConfirmScreen");
        }
    });
}

正如您在代码中的注释中看到的那样,调用了toggleConfirmPhotoScreen,但runOnUiThread中的任何内容都没有调用,我认为OutOfMemoryException发生的时候是这样的。

EN

回答 1

Stack Overflow用户

发布于 2017-07-15 12:18:36

放入你的载货单

android:largeHeap="true“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45113820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档