我的同事和我在使用Android Canvas对象时遇到了非常奇怪的行为。
我们正在处理初始化的画布对象,并且有选择地在2个Nexus 7平板电脑之间获得致命信号11错误;其中一个运行4.2.2并且工作正常,另一个运行4.3并崩溃。我们正试图弄清楚如何解决问题,包括确定错误是我们自己的问题,还是Android API中的一些小故障(不太可能)。
当我们尝试在对象上调用canvas.getWidth()
时会发生错误。
我们的Java代码:(不是说它可能很重要,但是Rect来自我们的代码库,它不是android.graphics.Rect
)
public Rect getViewportBounds() {
Canvas can = _diagram._canvas;
Rect vb = _viewportBounds;
if (can == null) return vb;
Point pos = _position;
int[] approxWindowVals = { (int) pos.getX(), (int) pos.getY() };
double sc = _scale;
vb._set(approxWindowVals[0], approxWindowVals[1], Math.max(can.getWidth(), 0) / sc, Math.max(can.getHeight(), 0) / sc);
return vb;
}
我们来自LogCat的信息在这里
08-09 16:49:14.883: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 08-09 16:49:14.893: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 08-09 16:49:14.923: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 08-09 16:49:14.943: D/abc(4083): onDraw 08-09 16:49:14.943: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 08-09 16:49:14.973: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 08-09 16:49:14.983: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during second layout pass: posting in next frame 08-09 16:49:15.003: W/View(4083): requestLayout() improperly called by com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0} during layout: running second layout pass 08-09 16:49:15.033: A/libc(4083): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4083 (egressiontester)
我们的硬件配置如下:
+---------+------------+-----------------------+ | Tablet | Android OS | Reached Error | +---------+------------+-----------------------+ | Nexus 7 | 4.2.2 | NO | | Nexus 7 | 4.3 | YES | +---------+------------+-----------------------+
如果你知道为什么会这样,请告诉我。我们可能不得不重新构建Canvas,但我们都很困惑,像Canvas这样常见的类在两个相同的平板电脑上表现不同。
非常感谢您的支持:)
答案 0 :(得分:1)
如果更改的标志为false,则不在第二个布局传递上渲染,解决了这个问题。
答案 1 :(得分:0)
我们通过简单地将Canvas对象在使用后赋值为null来解决此问题。这可能导致Android API使用有效地址重新初始化。
问题已经解决,但地址问题在4.2.2而不是4.3上隐含解决的事实可能是一个错误,应该进一步研究。