我和我的同事在使用 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() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 布局期间:运行第二个布局通道 08-09 16:49:14.893: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 在第二次布局过程中:在下一帧中发布 08-09 16:49:14.923: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 布局期间:运行第二个布局通道 08-09 16:49:14.943: D/abc(4083): onDraw 08-09 16:49:14.943: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 在第二次布局过程中:在下一帧中发布 08-09 16:49:14.973: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 布局期间:运行第二个布局通道 08-09 16:49:14.983: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED....... 0,0-0,0} 在第二次布局过程中:在下一帧中发布 08-09 16:49:15.003: W/View(4083): requestLayout() 被 com.nwoods.go.Viewport{41dfcb08 V.ED.... 调用不当 0,0-0,0} 布局期间:运行第二个布局通道 08-09 16:49:15.033: A/libc(4083): 致命信号 11 (SIGSEGV) 在 0x00000000 (code=1), 线程 4083 (egressiontester)
我们的硬件配置如下:
+---------+------------+-----------+ | 平板电脑 | 安卓操作系统 | 到达错误 | +---------+------------+-----------+ | 连结7 | 4.2.2 | 否 | | 连结7 | 4.3 | 是 | +---------+------------+-----------+
如果您对为什么会发生这种情况有任何想法,请告诉我。我们可能不得不重组 Canvas,但我们都非常困惑,像 Canvas 这样常见的类在两个相同的平板电脑上表现不同。
非常感谢您的支持 :)