小编Guz*_*zba的帖子

Android/Java罕见且看似不可能的异常导致力量接近

我从我发布的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.但很少.我有成千上万的人每天使用该应用程序,并获得可能二十次强制关闭报告.

这是我无法避免的事情,可能是手机内存的问题等,还是我能做的事情,我还没有想到呢?谢谢.

java arrays android exception multidimensional-array

3
推荐指数
1
解决办法
465
查看次数

volatile是一种在线程之间传递MotionEvent的安全方法吗?

我很好奇这个方法的安全性,我考虑过在我的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 != …

java multithreading android

3
推荐指数
1
解决办法
911
查看次数