我和我的同事在使用Android Canvas对象时遇到非常奇怪的行为。

我们正在处理一个初始化的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):com.nwoods.go.Viewport {41dfcb08 V.ED ....... 0,0-0,0}:在布局期间:运行第二个布局遍
08-09 16:49:14.893:W/View(4083):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):com.nwoods.go.Viewport {41dfcb08 V.ED .... 0,0-0,0}在第二遍布局中:在下一帧中发布
08-09 16:49:14.973:W/View(4083):com.nwoods.go.Viewport {41dfcb08 V.ED .... 0,0-0,0}:在布局期间:运行第二个布局遍
08-09 16:49:14.983:W/View(4083):com.nwoods.go.Viewport {41dfcb08 V.ED .... 0,0-0,0}在第二遍布局中:在下一帧中发布
08-09 16:49:15.003:W/View(4083):com.nwoods.go.Viewport {41dfcb08 V.ED .... 0,0-0,0}:在布局期间:运行第二个布局遍
08-09 16:49:15.033:A/libc(4083):致命信号11(SIGSEGV)位于0x00000000(代码= 1),线程4083(egressiontester)

我们的硬件配置如下:

+ --------- + ------------ + ----------------------- +
|平板电脑| Android作业系统|达到错误|
+ --------- + ------------ + ----------------------- +
| Nexus 7 | 4.2.2 |否|
| Nexus 7 | 4.3 |是的
+ --------- + ------------ + ----------------------- +

如果您对为什么会发生这种情况有任何想法,请告诉我。我们可能必须重组Canvas,但我们都感到困惑,因为Canvas一样常见的类在两个相同的平板电脑上的行为有所不同。

非常感谢您的支持 :)

最佳答案

如果更改的标志为假,则不在第二个布局 channel 上进行渲染,这对我来说解决了这个问题。

10-06 07:19