我的同事和我在使用Android Canvas 对象时遇到了非常奇怪的行为。我们处理一个初始化的画布对象,有选择性地在两个Nexus 7平板电脑之间得到致命信号11错误;其中一个运行4.2.2版本,工作正常,而另一个运行4.3版本即崩溃。我们正在努力找出如何解决问题,这涉及确定错误是由我们导致的还是 Android API 中的某些问题(不太可能)。
当我们尝试在该对象上调用
我们的Java代码:(尽管这可能不重要,但Rect来自我们的代码库,它不是
我们从LogCat中得到的信息在这里。
08-09 16:49:14.883: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.893: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.923: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 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.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.973: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.983: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:15.003: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:15.033: A/libc(4083): 致命信号11(SIGSEGV)于0x00000000处(代码=1),线程4083(egressiontester)。
我们的硬件配置如下:
非常感谢您的支持 :)
当我们尝试在该对象上调用
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.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.893: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.923: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 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.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:14.973: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 08-09 16:49:14.983: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在第二次布局传递期间错误地调用了requestLayout():在下一帧中发布。 08-09 16:49:15.003: W/View(4083): com.nwoods.go.Viewport{41dfcb08 V.ED.... ......I. 0,0-0,0}在布局期间错误地调用了requestLayout():正在运行第二次布局传递。 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这样常见的类在两个完全相同的平板电脑上表现不同。
非常感谢您的支持 :)