Android应用程序编程:在线程中填充二维数组

4
我正在尝试校准加速度计,但我无法获得校准所需的6个不同加速度读数的6个样本值。PreliminaryW是一个double [6] [3]数组,用于填充这些样本值。它是6乘以3,因为每个加速度读数都有x,y和z分量。
我计划通过在6个不同的加速度读数处按下按钮来对它们进行采样。这个按钮使“calibrate”变为true。
当然,我首先要将“calibrating”设置为true来启动此线程。
出于某种难以理解的原因,preliminaryW [i] = currentAcc似乎会从0到i使用相同的值填充,而不是只有i。我确保每次按下“校准”按钮时,currentAcc都是不同的。
我的代码有什么问题吗?
public synchronized void run() {
    Log.d(TAG, "+ in Calibrator thread +");

    int i = -1;
    while (calibrating) {
        if (calibrate) {
            i = i + 1;
            calibrate = false;
            preliminaryW[i] = currentAcc;
            if (i == 5) {
                calibrating = false;
            }
        }
    }
}
1个回答

0

我对加速度计的内部工作不是很熟悉,如果没有看到更多代码,很难决定为什么它不起作用。例如,您能确定只有一个线程实例,还是正在创建多个实例吗?

为什么需要将此放入线程中?

像那样循环是不好的做法,如果您绝对需要一个线程,应该使用wait/notify。 (更多信息可参见 http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

我已经草拟了一个类,几乎可以实现您想要的功能,但不使用线程。您可以创建一个校准器,然后对每个新值调用performCalibration():

class Calibrator{
    int count = 0;
    double[][] preliminaryW = new double[6][3];

    public void performCalibration(double[] currentAcc){
        preliminaryW[count] = currentAcc;
        count++;
    }
}

没有线程和“忙循环”,您可能可以省略“校准”和“正在校准”的标志,这肯定会有助于调试。

祝好运!


嗨,感谢您的回答。 我刚刚发现,如果: preliminaryW[i][0] = currentAcc[0]; preliminaryW[i][1] = currentAcc[1]; preliminaryW[i][2] = currentAcc[2]; 我的代码实际上是可以工作的。 由于某种原因,在Java中,一个二维数组不能像数组一样存储..? 它需要成为一个线程,因为在将其存储到preliminaryW中时,currentAcc必须更改。 - user3064869

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接