我从我发布的Android应用程序向我报告了一个有趣的问题.我有一个二维数组,我正在迭代使用两个for循环,如下所示:
for (int i = 0; i < arr.length; ++i)
{
for (int j = 0; j < arr[i].length; ++j)
{
if (arr[i][j] != 0)
// does stuff
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,不知何故,arr [i] [j]!= 0正在抛出一个ArrayIndexOutOfBoundsException.但很少.我有成千上万的人每天使用该应用程序,并获得可能二十次强制关闭报告.
这是我无法避免的事情,可能是手机内存的问题等,还是我能做的事情,我还没有想到呢?谢谢.
我很好奇这个方法的安全性,我考虑过在我的Android应用程序中传递触摸事件(并测试我对Java中的并发性的理解).这是基础知识:
我有一个SurfaceView连接到SurfaceHolder.Callback来获取用户输入事件,主要是onTouchEvent回调.在onTouchEvent调用该方法之后,我会看到是否event.getAction() == MotionEvent.ACTION_UP,如果是,则调用我已命名的postTouchEvent方法,该方法是我的应用程序线程的成员方法,用于更新应用程序的状态并绘制到画布.
SurfaceView
@Override
public boolean onTouchEvent(final MotionEvent event)
{
mAppThread.postTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
AppThread
private volatile MotionEvent mInputEvent;
public void postTouchEvent(final MotionEvent event)
{
this.mInputEvent = event;
}
@Override
public void run()
{
// while loop ...
if (this.mInputEvent != null)
{
final MotionEvent inputEvent = this.mInputEvent;
this.mInputEvent == null;
// update state based on inputEvent (not this.mInputEvent)
}
// draw to canvas
}
Run Code Online (Sandbox Code Playgroud)
现在我明白它肯定不是原子的,但是因为我从框架中接收它后将其视为不可变的,这不会起作用吗?(而不是同步post方法和if语句,我没有问题,但我要学习.)
这是我的想法.我知道我将对该对象有一个有效的引用,但我不确定我将实际看到该对象的状态.虽然测试一切都运行得很好,但我知道异常的线程异常是多么罕见,即使某些东西被破坏了.
此外,我可以看到一个问题:如果另一个MotionEvent出现,那么run()方法中的inputEvent可能会设置为与this.mInputEvent != …