9

我和我的同事在使用 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 这样常见的类在两个相同的平板电脑上表现不同。

非常感谢您的支持 :)

4

2 回答 2

1

如果更改的标志为 false,则不会在第二个布局通道上呈现,这为我解决了这个问题。

于 2013-09-09T22:03:01.230 回答
0

我们通过在使用 Canvas 对象后简单地将其分配为 null 来解决此问题。在幕后,这可能导致 Android API 使用有效地址重新初始化它。

问题已解决,但地址问题在 4.2.2 而不是 4.3 上已隐式解决这一事实可能是一个错误,应进一步研究。

于 2013-08-12T14:09:49.017 回答