我和我的同事在使用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 上进行渲染,这对我来说解决了这个问题。