GVKun编程网logo

StackOverflowError for SWT Table and Patches

11

对于想了解StackOverflowErrorforSWTTableandPatches的读者,本文将提供新的信息,并且为您提供关于ActionBarSherlockforAndroid导致Stack

对于想了解StackOverflowError for SWT Table and Patches的读者,本文将提供新的信息,并且为您提供关于ActionBarSherlock for Android导致StackOverflowError、Android Studio 3.1 EditText StackOverflowError、android – 从onDraw()调用getDrawingCache()时的StackOverflowError、android-StackOverflowError 1.5与1.6的有价值信息。

本文目录一览:

StackOverflowError for SWT Table and Patches

StackOverflowError for SWT Table and Patches

Pathes link

Table_Patched.class for org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar

Table_Patched.class for org.eclipse.swt.win32.win32.x86_64_3.6.1.v3655c.jar

You can also download the patched plugins with table pathced:

org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar

org.eclipse.swt.win32.win32.x86_64_3.6.1.v3655c.jar

Error:

Sometimes when you use swt table and remove multiple columns, maybe you get the following exception:

java.lang.StackOverflowError
	at org.eclipse.swt.internal.win32.OS.CallWindowProcW(Native Method)
	at org.eclipse.swt.internal.win32.OS.CallWindowProc(OS.java:2362)
	at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:564)
	at org.eclipse.swt.widgets.Table.callWindowProc(Table.java:430)
	at org.eclipse.swt.widgets.Control.windowProc(Control.java:4251)
	at org.eclipse.swt.widgets.Table.windowProc(Table.java:5779)
	at org.eclipse.swt.widgets.Display.windowProc(Display.java:4886)
	at org.eclipse.swt.internal.win32.OS.SendMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.SendMessage(OS.java:3156)
	at ...

Maybe the usage is the same as SWT Table with SWT.VIRTUAL raises StackOverflowError , maybe not. It is no matter. 


Causes:

This is a bug existing in Window 7(both 32bits and 64bits), please refer to the bug from eclipse Bug 316813 - Stack overflow still happens in table on Windows 7. In fact this bug presents in swt-3.6.1-win32-win32-x86 and swt-3.6.2-win32-win32-x86. The bug is fixed in swt-3.7(Verified).


Solution:


Solution 1. In my development, due to some reasons we can not update swt version from 3.6 to 3.7. So I decide to make a patch for 3.6.1. Before all, we need to get the swt source code from Git. You can refer to this article Using SWT From Git, I will draft another blog named Get SWT Source Code From Git to demonstrate how to get swt source code.

When getting the source code of SWT, refer to the following changes to update the Table.java file. For swt_win32_X86, you can also get the patch from above link.

### Eclipse Workspace Patch 1.0
#P org.eclipse.swt
Index: Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java,v
retrieving revision 1.544
diff -u -r1.544 Table.java
--- Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java	31 May 2010 16:44:10 -0000	1.544
+++ Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java	14 Jun 2010 20:01:08 -0000
@@ -6579,7 +6579,22 @@
 			*/
 			if ((style & SWT.VIRTUAL) != 0 && !item.cached) {
 				if (ignoreShrink) {
-					OS.SendMessage (handle, OS.LVM_REDRAWITEMS, plvfi.iItem, plvfi.iItem);
+					/*
+					* Feature in Windows 7. Using LVM_REDRAWITEMS causes LVN_GETDISPINFO
+					* to be sent before the method returns. For this reason, LVM_REDRAWITEMS
+					* can never be used from a LVN_GETDISPINFO handler. The fix is to InvalidateRect()
+					* passing the bounds of the entire item.
+					*/
+					if (!OS.IsWinCE && OS.VERSION (6, 1) >= OS.WIN32_VERSION) {
+						RECT rect = new RECT ();
+						rect.left = OS.LVIR_BOUNDS;
+						ignoreCustomDraw = true;
+						int /*long*/ code = OS.SendMessage (handle, OS. LVM_GETITEMRECT, plvfi.iItem, rect);
+						ignoreCustomDraw = false;
+						if (code != 0) OS.InvalidateRect (handle, rect, true);
+					} else {
+						OS.SendMessage (handle, OS.LVM_REDRAWITEMS, plvfi.iItem, plvfi.iItem);
+					}
 					break;
 				}
 			}

Note: For swt_win32_X86_64 you have to change 

int /*long*/ code = OS.SendMessage (handle, OS. LVM_GETITEMRECT, plvfi.iItem, rect);
to
long code = OS.SendMessage (handle, OS. LVM_GETITEMRECT, plvfi.iItem, rect);


Solution 2. 

Update the swt with version 3.6 to 3.7.

-----------------

I have made a patch for swt_3.6.1_win32_x86, but BLOG does not support attachment, so...

ActionBarSherlock for Android导致StackOverflowError

ActionBarSherlock for Android导致StackOverflowError

我将ActionBarSherlock集成到我的 Android应用程序中.它主要运作良好,有一个严重的例外……

当专门在API级别10(对应于Android 2.3.3)上运行时,并且仅在该版本上运行时,当用户在两个特定活动之间导航时,会发生StackOverflowError(如下所示).调用堆栈显示此错误完全在Android框架内发生,与我的自定义代码无关.

我知道它与ActionBarSherlock相关的唯一原因是,如果我将我的更改恢复到活动类,以便它们再次从标准Activity基类继承而不是SherlockActivity,并且恢复为非Sherlock主题,则不会发生错误.

FATAL EXCEPTION: main
java.lang.StackOverflowError
at com.android.internal.util.ArrayUtils.emptyArray(ArrayUtils.java:107)
at android.text.SpannableStringInternal.getSpans(SpannableStringInternal.java:269)
at android.text.SpannedString.getSpans(SpannedString.java:25)
at android.text.Styled.drawUniformRun(Styled.java:67)
at android.text.Styled.drawDirectionalRun(Styled.java:322)
at android.text.Styled.drawText(Styled.java:381)
at android.text.Layout.drawText(Layout.java:1703)
at android.text.Layout.draw(Layout.java:505)
at android.text.BoringLayout.draw(BoringLayout.java:365)
at android.widget.TextView.onDraw(TextView.java:4431)
at android.view.View.draw(View.java:6880)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.widget.ScrollView.draw(ScrollView.java:1703)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.buildDrawingCache(View.java:6640)
at android.view.View.getDrawingCache(View.java:6428)
at android.view.ViewGroup.drawChild(ViewGroup.java:1571)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.widget.FrameLayout.draw(FrameLayout.java:357)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1921)
at android.view.ViewRoot.draw(ViewRoot.java:1526)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1262)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1863)

解决方法

我很快就连续两次调用invalidateOptionsMenu()时遇到了类似的错误(在onResume中,然后在onPrepareOptionsMenu中).

一旦我从onPrepareOptionsMenu中删除了invalidateOptionsMenu()调用,问题就消失了.也许这不是你情况下发生的事情,但只是想我会把它作为一种可能的解决方案.

Android Studio 3.1 EditText StackOverflowError

Android Studio 3.1 EditText StackOverflowError

更新到Android Studio 3.1后,当EditText处于焦点时我面临异常

E/AndroidRuntime: FATAL EXCEPTION: main
Process: <package>, PID: 18938
java.lang.StackOverflowError: stack size 8MB
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)
    at android.view.inputmethod.InputConnectionWrapper.getTextBeforeCursor(InputConnectionWrapper.java:46)

知道如何解决这个问题吗?

更新:

经过一些研究后,我发现StackOverflowError出现了不同的堆栈跟踪和简单的EditText:

<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"/>

当我尝试输入任何符号时,我得到:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: <package>, PID: 21122
java.lang.StackOverflowError: stack size 8MB
    at android.view.inputmethod.InputConnectionWrapper.beginBatchEdit(InputConnectionWrapper.java:106)

当我按下时:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: <package>, PID: 21280
java.lang.StackOverflowError: stack size 8MB
    at android.view.inputmethod.InputConnectionWrapper.finishComposingText(InputConnectionWrapper.java:78)

甚至在WebView中输入文本也会导致此错误

在AS 3.0 EditText中工作正常

解决方法:

正如@evi所指出的,有a bug in advanced profiling.

暂时禁用它(编辑配置设置 – >性能分析 – >启用高级性能分析)可防止EditText崩溃

更新:

修复于Android Studio 3.1.1发布

高级分析再次可用!

android – 从onDraw()调用getDrawingCache()时的StackOverflowError

android – 从onDraw()调用getDrawingCache()时的StackOverflowError

我有一个手动绘制的自定义视图.我正在将内容绘制到位图中,然后在onDraw()中使用该位图.我意识到,如果我启用绘图缓存,我可以使用该缓存而不是创建自己的位图.这主要是有效的.

目前我的onDraw方法如下所示:

protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(getDrawingCache(), 0, 0, null);
}

这适用于我尝试过的模拟器.但是我在StackOverflowError上收到崩溃报告.报告看起来像这样:

java.lang.StackOverflowError
at android.view.View.getDrawingCache(View.java:10481)
at android.view.View.getDrawingCache(View.java:10446)
at com.aragaer.jtt.JTTClockView.onDraw(JTTClockView.java:162)
at android.view.View.draw(View.java:10983)
at android.view.View.buildDrawingCache(View.java:10700)
at android.view.View.getDrawingCache(View.java:10481)
at android.view.View.getDrawingCache(View.java:10446)
and so on...

我看过android源码,实际上是buildDrawingCache调用draw().这可以解释循环.但是buildDrawingCache()应该在第二次调用时立即返回.

除非设置了PFLAG_DRAWING_CACHE_VALID(source),否则不会发生这种情况.并且仅当视图附加到父级时才设置该标志,IS硬件加速AND层类型为LAYER_TYPE_NONE(source again).

问题是 – 是否可以将图层类型显式设置为not-none或者我应该使用其他方法?如果是,我应该选择哪种类型?

解决方法:

getDrawingCache()从未打算由View本身使用.它由父母管理.当View是硬件加速时未设置标志的原因是因为“绘图缓存”与硬件加速具有不同的含义.它用于控制显示列表的生命周期.即使你想要它时设置了标志,你也不会得到你想要的行为.

这里有两个解决方案:创建自己的位图或更好,只需在View上启用绘图缓存,不要从onDraw()调用canvas.drawBitmap(getDrawingCache(),…).无论如何,父母会为你做这件事!

android-StackOverflowError 1.5与1.6

android-StackOverflowError 1.5与1.6

我有一个创建ListActivity的布局.在显示ListActivity之前,我先执行数据库查询,然后使用SimpleCursorAdapter将数据挂接到列表.

所有这些在1.6及更高版本上都可以正常工作.在1.5上,执行查询的my函数成功执行,但几秒钟后发生StackOverflowError.有谁知道为什么在1.5中而不是1.6中会发生此错误?

更新:我确定当我从带有TabView的Activity移至带有ListView的Activity时发生崩溃.如果我从不包含选项卡视图的活动中转到ListView,则不会发生崩溃. ListView的活动正在将游标返回到查询,该查询中数据库有大约10列.在这10列中,我在屏幕上显示3列.

这是我的代码的执行流程:

TabView Activity sends Intent to start List View Activity

onCreate() //of ListActivity
{
    showList();
}

showList()
{
    //open DataBase
    //perform query
    //create SimpleCursorAdapter
    //setlistadapter
}

因此,例如,这在安装了2.1的Droid和目标为1.6的仿真器上可以完全正常运行.但是以上内容在HTC Hero 1.5和目标1.5的模拟器上均无效.

如果我让setlistadapter执行,则会发生崩溃.如果那条线出了,一切正常,但是显然我的数据没有显示.它不会在调用setlistadapter的行上崩溃,但是如果曾经执行过setlistadapter,它将最终崩溃.

堆栈跟踪:

Thread [<3> main] (Suspended (exception StackOverflowError))

ViewRoot.draw(boolean) line: 1235   
ViewRoot.performTraversals() line: 1030 
ViewRoot.handleMessage(Message) line: 1482  
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 
ActivityThread.main(String[]) line: 3948    
Method.invokeNative(Object,Object[],Class,Class[],int,boolean) line: not available [native method]  
Method.invoke(Object,Object...) line: 521  
ZygoteInit$MethodAndArgsCaller.run() line: 782  
ZygoteInit.main(String[]) line: 540 
NativeStart.main(String[]) line: not available [native method]  
最佳答案
也许此错误不是由数据库引起的.

实际上,当您的布局层次结构太深时,通常会发生此错误.

对于1.5,它可能是13个深度.也许尝试用Hierarchy Viewer进行检查.

此外,发布堆栈跟踪可能会有所帮助.

更新:
Stacktrace明确指出问题出在您的行布局中.当您注释掉设置适配器时,不会绘制行,因此不会发生错误.

也许您在行中嵌套了太多的LinearLayout?尝试制作简单的行-如果问题消失了,您将知道要维修什么.

还可以考虑从LinearLayout移至RelativeLayout.它展平了您的视图层次结构.尽管考虑到RelativeLayout有一些错误,例如. RelativeLayout differences between 1.5 and 2.1.

关于StackOverflowError for SWT Table and Patches的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于ActionBarSherlock for Android导致StackOverflowError、Android Studio 3.1 EditText StackOverflowError、android – 从onDraw()调用getDrawingCache()时的StackOverflowError、android-StackOverflowError 1.5与1.6的相关信息,请在本站寻找。

本文标签: