2017-07-15 3 views
0

Je tente d'enregistrer la trame reçue sur FrameProcessor.Delegate.onFrameProcessed.Erreur OutOfMemory avec runOnUiThread et Flir One SDK

Si je tente d'utiliser runOnUiThread à l'intérieur du fil qui utilise renderedImage.getFrame().save(...), je reçois l'exception suivante:

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) 

Ceci est la méthode qui fait le fil d'origine:

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(); 
     } 
    } 
}; 

La méthode utilise runOnUiThread:

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"); 
     } 
    }); 
} 

Comme vous pouvez e dans les commentaires dans le code, toggleConfirmPhotoScreen est appelé, mais rien à l'intérieur runOnUiThread est, il y a quand je suppose que le OutOfMemoryException se produit.

Répondre

0

mis dans votre manifeste
android: largeHeap = "true"

+0

N'a pas travaillé .... mais merci! – RominaV