Java Android执行if语句,即使它不应该';我从来没有执行过?
好吧,我没有其他方法来表达,我有一个函数,如下所示:Java Android执行if语句,即使它不应该';我从来没有执行过?,java,android,debugging,Java,Android,Debugging,好吧,我没有其他方法来表达,我有一个函数,如下所示: @Override public void onSensorChanged(SensorEvent event) { old_orientation = orientation; if(event.sensor == grav) { last_grav_reading = event.values; } else { last_magnet_reading = event.values;
@Override
public void onSensorChanged(SensorEvent event) {
old_orientation = orientation;
if(event.sensor == grav) {
last_grav_reading = event.values;
} else {
last_magnet_reading = event.values;
}
if (last_grav_reading != null && last_magnet_reading != null) {
sensorManager.getRotationMatrix(mat_rotation, mat_inclination, last_grav_reading, last_magnet_reading);
sensorManager.getOrientation(mat_rotation, orientation);
if (listener != null) {
listener.onOrientationSensorUpdate(old_orientation, orientation);
}
}
}
所以“getRotationMatrix”应该只在最后一个磁铁读数和最后一个重力读数都非零时执行,对吗
再猜一次,该行实际执行(并导致重大崩溃),一张显示案例的图片(所选行是调试器报告正在执行的行,下面可以看到每个变量的值):
所以。。。。发生什么事?JRE是否在android上安装了窃听器?哦,没有其他函数/线程访问这些变量。此外,它不会发生在我的主手机(安卓5.0.1)上,但会发生在我的第二代nexus(4.3)上。 (我可以“预期”一个传感器根本就不在那里,但这仍然会违反if声明) 编辑,全班:
public class OrientationTracker implements SensorEventListener, IOrientationTracker {
private SensorManager sensorManager;
private Sensor magnet;
private Sensor grav;
private float[] last_grav_reading;
private float[] last_magnet_reading;
private float[] mat_inclination = new float[9];
private float[] mat_rotation = new float[9];
private float[] old_orientation;
private float[] orientation;
private boolean isRunning;
private OrientationUpdateListener listener;
public OrientationTracker(Context context) {
sensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
this.magnet = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
this.grav = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
this.orientation = new float[]{0,0,0};
isRunning = false;
if (this.magnet != null &&this.grav != null){
// Success! There's a magnetometer.
}
}
public void start(){
if(isRunning) {
//Already running, do nothing
return;
}
registerSensors();
isRunning = true;
}
public void start(OrientationUpdateListener listener) {
start();
this.listener = listener;
}
public void stop() {
unregisterSensors();
isRunning = false;
}
public void registerSensors() {
sensorManager.registerListener(this, magnet, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, grav, SensorManager.SENSOR_DELAY_NORMAL);
}
public void unregisterSensors() {
sensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
old_orientation = orientation;
String t = event.sensor.getName();
String p = grav.getName();
if(event.sensor.equals(grav)) {
last_grav_reading = event.values;
} else {
last_magnet_reading = event.values;
}
if (last_grav_reading != null && last_magnet_reading != null) {
sensorManager.getRotationMatrix(mat_rotation, mat_inclination, last_grav_reading, last_magnet_reading);
sensorManager.getOrientation(mat_rotation, orientation);
if (listener != null) {
listener.onOrientationSensorUpdate(old_orientation, orientation);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
和跟踪:
"<1> main@830026754464" prio=5 runnable
java.lang.Thread.State: RUNNABLE
at com.scoutingstuff.paul.ivossenjacht.OrientationTracker.onSensorChanged(OrientationTracker.java:71)
at android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Method.java:-1)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(NativeStart.java:-1)
"<12> android.hardware.SystemSensorManager$SensorThread@830035660424" prio=5 runnable
java.lang.Thread.State: RUNNABLE
Incompatible thread state: thread not suspended
"<11> GLThread 357@830035646696" prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<10> Binder_2@830035587352" prio=5 runnable
java.lang.Thread.State: RUNNABLE
Incompatible thread state: thread not suspended
"<9> Binder_1@830035581424" prio=5 runnable
java.lang.Thread.State: RUNNABLE
Incompatible thread state: thread not suspended
"<8> FinalizerWatchdogDaemon@830035565608" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<7> FinalizerDaemon@830035565176" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<6> ReferenceQueueDaemon@830035564816" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<5> Compiler@830035564576" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<3> Signal Catcher@830035564096" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
"<2> GC@830035563872" daemon prio=5 waiting
java.lang.Thread.State: WAITING
Incompatible thread state: thread not suspended
”main@830026754464“prio=5可运行
java.lang.Thread.State:可运行
在com.scoutingstuff.paul.ivossenjacht.OrientationTracker.onSensorChanged(OrientationTracker.java:71)
位于android.hardware.SystemSensorManager$ListenerDelegate$1.handleMessage(SystemSensorManager.java:204)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5041)
位于java.lang.reflect.Method.Invokenactive(Method.java:-1)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
位于dalvik.system.NativeStart.main(NativeStart.java:-1)
“android.hardware.SystemSensorManager$SensorThread@830035660424“prio=5可运行
java.lang.Thread.State:可运行
不兼容的线程状态:线程未挂起
“GLThread357@830035646696“prio=5等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
“活页夹_2@830035587352“prio=5可运行
java.lang.Thread.State:可运行
不兼容的线程状态:线程未挂起
“活页夹_1@830035581424“prio=5可运行
java.lang.Thread.State:可运行
不兼容的线程状态:线程未挂起
" FinalizerWatchdogDaemon@830035565608“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
" FinalizerDaemon@830035565176“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
" ReferenceQueueDaemon@830035564816“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
" Compiler@830035564576“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
“信号Catcher@830035564096“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
" GC@830035563872“守护进程prio=5正在等待
java.lang.Thread.State:正在等待
不兼容的线程状态:线程未挂起
第一个问题返回的是什么事件.值
?
如果它返回空数组,那么If station将始终执行,因为last\u grav\u reading!=null
始终为真
(last_grav_reading != null && last_magnet_reading != null)
在您收到重力事件和磁铁事件后为真。没有上次读回null的代码。你是说
if(event.sensor == grav) {
last_magnet_reading = null;
last_grav_reading = event.values;
} else {
last_grav_reading = null;
last_magnet_reading = event.values;
}
两个传感器都连接到同一个侦听器此
sensorManager.registerListener(this, magnet, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, grav, SensorManager.SENSOR_DELAY_NORMAL);
请发布stacktrace。“android上是否安装了JRE漏洞?”——android上没有JRE。除此之外,在不制作数组内容的本地副本的情况下,停止保留
值SensorEvent
对象被合并和重用,因此您的值将是错误的。“哦,而且没有其他函数/线程访问这些变量”--为您的SensorEventListener
发布整个类,以及注册它的registerListener()
调用。