onSensorChanged中的无限循环

时间:2014-07-26 19:03:33

标签: android infinite-loop

帮助!我陷入无休止的循环,我无法起床!

结果

**** onCreate上行为不端的活动。

****在计划注册时行为错误。

****关于精确度变化的行为不端。

**** MisbehavingActivity Accelerometer onSensorChanged。

**** MisbehavingActivity onPause取消注册。

**** MisbehavingActivity Accelerometer onSensorChanged。

**** MisbehavingActivity onPause取消注册。

**** MisbehavingActivity Accelerometer onSensorChanged。

**** MisbehavingActivity onPause取消注册。

**** MisbehavingActivity Accelerometer onSensorChanged。

**** MisbehavingActivity onPause取消注册。

**** MisbehavingActivity Accelerometer onSensorChanged。

**** MisbehavingActivity onPause取消注册。

等。等等,直到:

不幸的是,Amiok已经停止了

以下是代码:

package com.apackage.amiok;

import android.content.Context;
//import android.content.Intent;
import android.hardware.Sensor;
import static android.hardware.Sensor.TYPE_ACCELEROMETER;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MisbehavingActivity extends AbstrActivity  implements OnClickListener, SensorEventListener {

    private static final String TOAST = "**** MisbehavingActivity ";
    SensorManager sensorManager;
    Sensor accelerometer;
    Button aButton;
    //SensorEventListener sensorListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        logStuff( TOAST + "onCreate. ");

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        accelerometer = sensorManager.getDefaultSensor(TYPE_ACCELEROMETER);

        setContentView(R.layout.activity_main); 

        aButton = ((Button) findViewById(R.id.buttonToStop));
        aButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        logStuff( TOAST + "onClick.");
        onPause();
        finish();
    }

    @Override
    public void onResume() {
        logStuff( TOAST + "onResume Register.");
        super.onResume();
        // register the listener
        accelerometer = sensorManager.getDefaultSensor(TYPE_ACCELEROMETER);
        sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    public void onPause() {
        logStuff( TOAST + "onPause Unregister.");

        // unregister the listener for all sensors
        sensorManager.unregisterListener(this);
        super.onPause();
    }


    // SensorEventListener stuff

        @Override
        public void onSensorChanged(SensorEvent event) { 
            logStuff( TOAST + "Accelerometer onSensorChanged.");  
            onPause();
            finish();

        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            logStuff( TOAST + "onAccuracyChanged.");
            // Not sure I need to do anything here...
        }
}

1 个答案:

答案 0 :(得分:0)

您正在将Activity实例注册为SensorEventListener两次,在onCreate和onResume方法上,只在onResume方法上保留一个注册,并在onCreate方法上删除注册。好的做法是调用onPause和onResume上的第一个超级方法。查看SensorManager上的示例代码。