java.lang.StackOverflowError: 堆栈大小 8MB
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/37065766/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.StackOverflowError: stack size 8MB
提问by Android Geek
I am using this libraryto blur the area beneath my layout in android. I am getting stackoverflowerror and activity crashes when the blur view is called. Please help. Thanks.
我正在使用这个库来模糊我在 android 中布局下方的区域。调用模糊视图时,出现 stackoverflowerror 和活动崩溃。请帮忙。谢谢。
Here is the code with logcat
这是带有logcat的代码
BlurringView Activity
模糊视图活动
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.util.AttributeSet;
import android.view.View;
/**
* A custom view for presenting a dynamically blurred version of another view's content.
* <p/>
* Use {@link #setBlurredView(android.view.View)} to set up the reference to the view to be blurred.
* After that, call {@link #invalidate()} to trigger blurring whenever necessary.
*/
public class BlurringView extends View {
public BlurringView(Context context) {
this(context, null);
}
public BlurringView(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = getResources();
final int defaultBlurRadius = res.getInteger(R.integer.default_blur_radius);
final int defaultDownsampleFactor = res.getInteger(R.integer.default_downsample_factor);
final int defaultOverlayColor = res.getColor(R.color.default_overlay_color);
initializeRenderScript(context);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PxBlurringView);
setBlurRadius(a.getInt(R.styleable.PxBlurringView_blurRadius, defaultBlurRadius));
setDownsampleFactor(a.getInt(R.styleable.PxBlurringView_downsampleFactor,
defaultDownsampleFactor));
setOverlayColor(a.getColor(R.styleable.PxBlurringView_overlayColor, defaultOverlayColor));
a.recycle();
}
public void setBlurredView(View blurredView) {
mBlurredView = blurredView;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mBlurredView != null) {
if (prepare()) {
// If the background of the blurred view is a color drawable, we use it to clear
// the blurring canvas, which ensures that edges of the child views are blurred
// as well; otherwise we clear the blurring canvas with a transparent color.
if (mBlurredView.getBackground() != null && mBlurredView.getBackground() instanceof ColorDrawable) {
mBitmapToBlur.eraseColor(((ColorDrawable) mBlurredView.getBackground()).getColor());
} else {
mBitmapToBlur.eraseColor(Color.TRANSPARENT);
}
mBlurredView.draw(mBlurringCanvas);
blur();
mBlurredView.invalidate();
canvas.save();
canvas.translate(mBlurredView.getX() - getX(), mBlurredView.getY() - getY());
canvas.scale(mDownsampleFactor, mDownsampleFactor);
canvas.drawBitmap(mBlurredBitmap, 0, 0, null);
canvas.restore();
}
canvas.drawColor(mOverlayColor);
}
}
public void setBlurRadius(int radius) {
mBlurScript.setRadius(radius);
}
public void setDownsampleFactor(int factor) {
if (factor <= 0) {
throw new IllegalArgumentException("Downsample factor must be greater than 0.");
}
if (mDownsampleFactor != factor) {
mDownsampleFactor = factor;
mDownsampleFactorChanged = true;
}
}
public void setOverlayColor(int color) {
mOverlayColor = color;
}
private void initializeRenderScript(Context context) {
mRenderScript = RenderScript.create(context);
mBlurScript = ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript));
}
protected boolean prepare() {
final int width = mBlurredView.getWidth();
final int height = mBlurredView.getHeight();
if (mBlurringCanvas == null || mDownsampleFactorChanged
|| mBlurredViewWidth != width || mBlurredViewHeight != height) {
mDownsampleFactorChanged = false;
mBlurredViewWidth = width;
mBlurredViewHeight = height;
int scaledWidth = width / mDownsampleFactor;
int scaledHeight = height / mDownsampleFactor;
// The following manipulation is to avoid some RenderScript artifacts at the edge.
scaledWidth = scaledWidth - scaledWidth % 4 + 4;
scaledHeight = scaledHeight - scaledHeight % 4 + 4;
if (mBlurredBitmap == null
|| mBlurredBitmap.getWidth() != scaledWidth
|| mBlurredBitmap.getHeight() != scaledHeight) {
mBitmapToBlur = Bitmap.createBitmap(scaledWidth, scaledHeight,
Bitmap.Config.ARGB_8888);
if (mBitmapToBlur == null) {
return false;
}
mBlurredBitmap = Bitmap.createBitmap(scaledWidth, scaledHeight,
Bitmap.Config.ARGB_8888);
if (mBlurredBitmap == null) {
return false;
}
}
mBlurringCanvas = new Canvas(mBitmapToBlur);
mBlurringCanvas.scale(1f / mDownsampleFactor, 1f / mDownsampleFactor);
mBlurInput = Allocation.createFromBitmap(mRenderScript, mBitmapToBlur,
Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
mBlurOutput = Allocation.createTyped(mRenderScript, mBlurInput.getType());
}
return true;
}
protected void blur() {
mBlurInput.copyFrom(mBitmapToBlur);
mBlurScript.setInput(mBlurInput);
mBlurScript.forEach(mBlurOutput);
mBlurOutput.copyTo(mBlurredBitmap);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (mRenderScript != null) {
mRenderScript.destroy();
}
}
private int mDownsampleFactor;
private int mOverlayColor;
private View mBlurredView;
private int mBlurredViewWidth, mBlurredViewHeight;
private boolean mDownsampleFactorChanged;
private Bitmap mBitmapToBlur, mBlurredBitmap;
private Canvas mBlurringCanvas;
private RenderScript mRenderScript;
private ScriptIntrinsicBlur mBlurScript;
private Allocation mBlurInput, mBlurOutput;
}
MyActivity class
我的活动类
BlurringView blurringView = (BlurringView) addView.findViewById(R.id.circle);
blurringView.setBlurredView(blurringView);
blurringView.invalidate();
Logcat Error
Logcat 错误
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.user.designsample, PID: 19998 java.lang.StackOverflowError: stack size 8MB at android.graphics.Canvas.drawOval(Canvas.java:1155) at android.graphics.Canvas.drawOval(Canvas.java:1147) at android.graphics.drawable.GradientDrawable.draw(GradientDrawable.java:615) at android.view.View.drawBackground(View.java:16376) at android.view.View.draw(View.java:16175) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundred 05-05 23:16:31.323 19998-19998/com.example.user.humandesignsample E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 6333780) 05-05 23:16:31.361 19998-19998/com.example.user.humandesignsample E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException: data parcel size 6333780 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:503) at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4425) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:90) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.user.designsample, PID: 19998 java.lang.StackOverflowError: stack size 8MB at android.graphics.Canvas.drawOval(Canvas.java:1155) at android.graphics.Canvas.drawOval(Canvas.java:1147) at android.graphics.drawable.GradientDrawable.draw(GradientDrawable.java:615) at android.view.View.drawBackground(View.java:16376) at android.view.View.draw(View.java:16175) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundredpx.android.blur.BlurringView.onDraw(BlurringView.java:65) at android.view.View.draw(View.java:16184) at com.fivehundred 05-05 23:16:31.323 19998-19998/com.example.user.humandesignsample E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 6333780) 05-05 23:16:31.361 19998-19998/com.example.user.humandesignsample E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException: data parcel size 6333780 bytes at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:503) at android.app.ActivityManagerProxy.handleApplicationCrash(ActivityManagerNative.java:4425) at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:90) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693) at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
回答by Bartek Lipinski
The problem is most certainly with this line:
问题肯定出在这一行:
blurringView.setBlurredView(blurringView);
You're assigning the BlurringView
to itself. It doesn't make any sense. What I assume (I don't want to read the whole BlurringView
class), setBlurredView
is used for the View
you want to blur. And the BlurringView
will act as a blur
overlay. So assigning the blur
overlay to be "blurred"
doesn't make any sense at all.
您正在将 分配BlurringView
给自身。这没有任何意义。我假设的(我不想阅读整个BlurringView
课程)setBlurredView
用于View
您想要模糊的内容。并且BlurringView
将充当blur
覆盖层。因此,将blur
覆盖分配为"blurred"
根本没有任何意义。
回答by Abhishek
try it like this
像这样试试
blurringView.setBlurredView(the_view_which_you_want_to_blur);
that's it
而已