我想我找到了问题,这里有一些代码,简单的代码,真的:
class OwnerDrawView : View
{
PointF m_screenPosition;
public OwnerDrawView(Context context)
: base(context)
{
this.Touch += new EventHandler<TouchEventArgs>(OwnerDrawView_Touch);
this.SetWillNotDraw(false);
}
protected override void OnDraw(Canvas canvas)
{
Core.Instance.OnDraw(canvas);
base.OnDraw(canvas);
}
void OwnerDrawView_Touch(object sender, View.TouchEventArgs e)
{
m_screenPosition = new PointF(e.Event.GetX(), e.Event.GetY());
switch (e.Event.Action) {
case MotionEventActions.Down:
Core.Instance.OnTouchDown(m_screenPosition);
break;
case MotionEventActions.Move:
Core.Instance.OnTouchMove(m_screenPosition);
break;
case MotionEventActions.Up:
Core.Instance.OnTouchUp(m_screenPosition);
break;
}
}
}
不要介意“Core”类,它在这里并不重要(虽然听起来很^_^)
要重现这个错误,只需将断点放在这一行:
Core.Instance.OnTouchDown(m_screenPosition);
在设备上运行程序,触摸屏幕,等待几秒钟,BOOM!
但是如果断点被放置在“Core.Instance.OnTouchUp(m_screenPosition)”行上,那就太惊喜了!一切安好!!我勒个去!!
我的整个程序在一个线程上运行,所以它不是多线程相关的东西。我确实有一个计时器,但该计时器仅在“OwnerDrawView”类上调用 PostInvalidate(是的!我正在使用 Canvas 构建游戏!)
这可能是 monodroid 中的一个错误,但如果有人在重现此错误时遇到问题,请忽略我(我总是一个不幸的人......)