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)
외관상으로 보면 프로그래밍 방식으로 또는 시스템에 의해 재활용 된 비트 맵을 표시하려고하는 것 같습니다. –
plese는 logcat을 게시하고 오류의 위치를 가리키는 코드 부분을 표시합니다. –
배경 이미지는입니다. 첫 번째 비트 맵을 기반으로, 응용 프로그램은 "bmp"가 재활용되지 않도록 배경을 blured로 설정하지 않고도 정상적으로 작동하므로 무엇이 발생할 수 있습니까? ADDED LOGCAT –