- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试校准加速度计,但我无法获得校准所需的 6 个不同加速度读数的 6 个样本值。 PreliminaryW 是一个 double[6][3] 数组,用于填充这些样本值。它是 6 x 3,因为每个加速度读数都有一个 x、y 和 z 分量。
我计划通过在 6 个不同的加速度读数处按下按钮来对它们进行采样。此按钮使“校准”为真。
当然,首先要使“校准”为真以启动此线程。
出于某些深不可测的原因,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;
}
}
}
}
最佳答案
我不是很熟悉加速度计的内部工作原理,如果不查看更多代码,很难确定它为什么不起作用。例如,您能否确定 Thread 只有一个实例,还是要创建多个实例?
为什么这需要在线程中?
这样的循环也不是好的做法,如果你绝对需要一个线程,你应该使用 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++;
}
}
如果没有 Thread 和“忙循环”,您可以省略那些“校准”和“校准”标志,这肯定也有助于调试。
祝你好运!
关于Android应用程序编程: Filling a two-dimensional array in a thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20370349/
我是一名优秀的程序员,十分优秀!