0

2 액티비티가 2 ImageViews으로 표시됩니다. 하나는 정사각형에 맞게 잘리고 두 번째 것은 첫 번째를 기반으로하고 CenterCropped은 흐림이있는 배경 이미지로 채 웁니다. 배경 이미지 흐림 프로세스는 스레드에서 발생합니다. 그 활동을 언급 한 직후 ActivityForResult에 의해 다른 활동 (예 : TextView, 확인 및 취소 버튼)과 같은 간단한 대화 상자를 호출하려고합니다. 작업이 완료되고 모든 것이 양호한 [확인/취소] 버튼을 클릭하면 Edittext을 입력하려고 할 때 문제가 발생하고 Cannot draw recycled bitmap 오류가 발생하여 다른 활동에 있음을 알 수 있습니다 !! 키보드가 뷰를 위로 밀어서 SoftPan에 액티비티를 설정하고 여전히 그 메시지를 받으면서 그것이 일어 났을 것이라고 생각했습니다. 배경을 흐리게 만드는 부분을 제거하면 앱이 정상적으로 작동합니다. 다음은 코드의 일부입니다 :안드로이드 비트 맵 편집 된 텍스트의 재활용 오류

이 방법 프로세스 JNI에서 이미지를, 그것의 약 3200px X 2400px 배경을 bluring에 대한

private void setImageViewResult() 
{ 
    Bitmap b = BitmapFactory.decodeFile(image.getAbsolutePath()); 
    // store the bitmap in the JNI "world" 
    final JniBitmapHolder bitmapHolder = new JniBitmapHolder(b); 
    // no need for the bitmap on the java "world", since the operations are done on the JNI "world" 
    b.recycle(); 
    // crop a center square from the bitmap, from (0.25,0.25) to (0.75,0.75) of the bitmap. 
    // bitmapHolder.cropBitmap(width/4,height/4,width*3/4,height*3/4); 
    // rotate the bitmap: 
    bitmapHolder.rotateBitmapCw90(); 
    // get the output java bitmap , and free the one on the JNI "world" 
    b = bitmapHolder.getBitmapAndFree(); 
    final int width = b.getWidth(), height = b.getHeight(); 
    // Bitmap b = ExifUtil.rotateBitmap(f.getAbsolutePath(), BitmapFactory.decodeFile(f.getAbsolutePath())); 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int screenWidth = size.x; 
    int screenHeight = size.y; 
    float boxSize = BOX_SIZE;// dpToPx(338); 
    float boxCenterInScreenHeight = screenHeight/2; 
    float boxCenterInScreenWidth = screenWidth/2; 
    float boxYInScreen = boxCenterInScreenHeight - boxSize/2; 
    float boxXInScreen = boxCenterInScreenWidth - boxSize/2; 
    float boxHeightRatio = boxSize/screenHeight; 
    float boxWidthRatio = boxSize/screenWidth; 
    float yRatio = boxYInScreen/screenHeight; 
    float xRatio = boxXInScreen/screenWidth; 
    float CropFromY = b.getHeight() * yRatio; 
    float CropFromX = b.getWidth() * xRatio; 
    // float HeightAndWidthToCrop = b.getHeight() * 
    // boxHeightRatio; 
    float HeightAndWidthToCrop = b.getWidth() * boxWidthRatio; 
    bitmapHolder.storeBitmap(b); 
    b.recycle(); 
    bitmapHolder.cropBitmap((int) CropFromX, (int) CropFromY, (int) HeightAndWidthToCrop + (int) CropFromX, (int) HeightAndWidthToCrop + (int) CropFromY); 
    bmp = bitmapHolder.getBitmapAndFree(); 
    ivResult.setImageBitmap(bmp); 
    setBackgroundBlur(); 
} 

첨부 :을 (가장 고귀한 RES AT 유지해야) :

private void setBackgroundBlur() 
{ 
    Config.getThreadPool().submit(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      // bgFile = StorageUtils.newTempFile("jpg"); 
      try 
      { 
       // WebExecutor.executeSync(new DownloadImage(item.getImageCoverUrl(), bgFile)); 
       Bitmap bmp2 = ImageUtils.createCenterCrop(bmp, new DimensionsRect((int) (Config.getScreenDimens().getWidth()/2f), 
                        (int) (Config.getScreenDimens().getHeight()/2f))); 
       bmp2 = ImageUtils.setGpuImageFilter(bmp2, new GPUImageSaturationFilter(1)); 
       Canvas c = new Canvas(bmp2); 
       c.drawColor(0x77000000); 
       bmp2 = ImageUtils.setGpuImageFilter(bmp2, new GPUImageBoxBlurFilter(1f)); 
       System.gc(); 
       bgBitmap = bmp2; 
       handler.post(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         android.util.Log.i("SEB BACKGROUND BLUR", "in method"); 
         Drawable d = new BitmapDrawable(bgBitmap); 
         // ivBackground.setImageBitmap(bgBitmap); 
         ((RelativeLayout) findViewById(R.id.toot)).setBackground(d); 
         ViewPropertyAnimator.animate(ivBackground).alpha(1).setDuration(500).start(); 
        } 
       }); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

에서 OnCreate는 SetImageViewResult를 호출하고, 두 번째 활동을 시작합니다

@Override 
protected void onCreate(final Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_rename_scan); 
    setSoftPan(); 
    final EditText etName = (EditText) findViewById(R.popScan.name); 
    final Button ok = (Button) findViewById(R.popScan.ok); 
    final Button cancel = (Button) findViewById(R.popScan.cancel); 
    ok.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(final View v) 
     {} 
    }); 
    cancel.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(final View v) 
     { 
      finish(); 
     } 
    }); 
} 

setBackgroundBlur 메서드의 내부에서 로그를 열어 키보드가 열린 후에 두 번째 호출되는지 확인하려고했지만 시도하지 않았습니다.

로그 캣 : 그것은 사용 된 메모리이기 때문에 재활용 된 비트 맵

b.recycle(); 

// get the output java bitmap , and free the one on the JNI "world" 
b = bitmapHolder.getBitmapAndFree(); 

그렇지 수 재 할당 값이 예외를 일으키는 코드 부분

05-25 16:51:49.913: E/AndroidRuntime(29258): FATAL EXCEPTION: main 
05-25 16:51:49.913: E/AndroidRuntime(29258): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:789) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.widget.ImageView.onDraw(ImageView.java:985) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13719) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12657) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13722) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12657) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12655) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12655) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13722) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.widget.FrameLayout.draw(FrameLayout.java:467) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12657) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12655) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13435) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.draw(View.java:13722) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.widget.FrameLayout.draw(FrameLayout.java:467) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2473) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12657) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.View.getDisplayList(View.java:12701) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1198) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2173) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.Choreographer.doFrame(Choreographer.java:532) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.os.Handler.handleCallback(Handler.java:725) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.os.Looper.loop(Looper.java:137) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at android.app.ActivityThread.main(ActivityThread.java:5227) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at java.lang.reflect.Method.invokeNative(Native Method) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at java.lang.reflect.Method.invoke(Method.java:511) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-25 16:51:49.913: E/AndroidRuntime(29258): at dalvik.system.NativeStart.main(Native Method) 
05-25 16:51:57.298: I/Process(29258): Sending signal. PID: 29258 SIG: 9 
05-25 16:51:57.583: E/Trace(29333): error opening trace file: No such file or directory (2) 
05-25 16:51:57.678: D/dalvikvm(29333): GC_EXPLICIT freed 172K, 78% free 2416K/10660K, paused 6ms+2ms, total 24ms 
05-25 16:51:57.773: E/BitmapFactory(29333): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.AppGate.mezuzot/cache/temp20140525_165145.jpg: open failed: ENOENT (No such file or directory) 
+0

외관상으로 보면 프로그래밍 방식으로 또는 시스템에 의해 재활용 된 비트 맵을 표시하려고하는 것 같습니다. –

+0

plese는 logcat을 게시하고 오류의 위치를 ​​가리키는 코드 부분을 표시합니다. –

+0

배경 이미지는입니다. 첫 번째 비트 맵을 기반으로, 응용 프로그램은 "bmp"가 재활용되지 않도록 배경을 blured로 설정하지 않고도 정상적으로 작동하므로 무엇이 발생할 수 있습니까? ADDED LOGCAT –

답변

0

인 해방. 당신은 그것을 암호 해독해야합니다. 귀하의 케이스에서 다른 변수를 사용하면 잘 작동합니다.

+0

setBackgroundBlur가 호출 된 것을 볼 수 있듯이 setBackgroundBlur에 대한 호출을 제거하면 제대로 작동하므로 ActivityForResult를 시작하고 원하는 것을 수행 할 수 있습니다. 말하자면 문제는 실제로 그 코드 라인이 2 가지 더 문제가된다는 것입니다. 1) 비트 맵을 재활용해야합니다. 메모리에 두는 것이 가장 큰 것입니다. 2) 정확히 다시 호출되는 코드입니까? EditText에 포커스가있을 때? 왜 그렇고 왜? –

+0

나는 이해하지만 당신이 예외를주지 않을 동일한 기능의 또 다른 위치에서 그것을 재활용한다는 것을 이해하지 못한다. 변수 네이밍은 혼란스럽고, edittext가 포커스를 가지고있을 때 충돌하는 것은 더 이상이 방법이 setSoftPan(); –

+0

SetsiftPan은 xml menifist의 속성과 정확히 일치합니다. 코드에 의해서만 가능합니다. 그리고 볼 수 있듯이, 그 비트 맵을 사용한 직후에 setBackgroundBlur 메서드를 호출하고 있습니다. 그 \t 비트 맵 객체를 사용하여 새로운 크기 조정 된 객체를 만듭니다.포커스가 있기 때문에 문제가되지 않는다는 것을 알기 때문에 이전에 말한 것처럼 \t somelogging을 그 메서드 또는 다른 비트 맵과 관련된 다른 메서드로 호출하여 다시 호출되는지 확인하려고했으나 그들은하지 않습니다. –