0

ユーザーがカウントダウン タイマーを設定できるようにする Android プログラムを作成したいと考えています。ユーザーが「スタートボタン」を押すと、カウントダウンが実行されます。カウントダウンが実行されている間、電話機はデバイスの加速度を認識する必要があります。

時間が経過した場合、またはデバイスが大きく揺れた場合は、新しいアクティビティをロードする必要があります..

私のデバイス (S4) では、コードは非常にうまく動作しています。デバイスが大きく振られた後、カウントダウン タイマーだけが閉じられないため、実行メソッドが突然アクティブになります。他のデバイス (S2) では、ボタンを押した直後に新しいアクティビティが開始されます。これはどうやってできるの?run-method を間違えたと思います。スレッドを正しく設定するという考えを理解しているかどうかわかりません。

これが私のコードです:

public class WaitingForBomb extends Activity {

float sensibility = 2.5f;
boolean isOver = false;
private SensorManager mSensorManager;
private float mAccel; // Beschleunigung
private float mAccelCurrent; // aktuelle Beschleunigung (in Verbindung mit
                                // Erdanziehung)?
private float mAccelLast; // letzte Beschleunigung (in Verbindung mit
                            // Erdanziehung)?
TextView anzeige;

@Override
protected void onCreate(Bundle savedInstanceState) {

    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.waiting);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mSensorManager.registerListener(mSensorListener,
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);
    mAccel = 0.00f;
    mAccelCurrent = SensorManager.GRAVITY_EARTH;
    mAccelLast = SensorManager.GRAVITY_EARTH;

    // Sleep-Timer
    Thread bombTimer = new Thread() {
        public void run() {
            while (isOver = false) {
                try {
                    // Intent-Übergabe des Counters
                    Intent mIntent = getIntent();
                    int counterValue = mIntent
                            .getIntExtra("pushCounter", 0);
                    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                    v.vibrate(counterValue);
                    sleep(counterValue);

                    isOver = true;

                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    isOver = true;
                }
            }
        }
    };

    bombTimer.start();

}

// Verhindert, dass die "Back-Taste" erkannt wird und somit das Spiel
// vorzeitig beendet wird.
@Override
public void onBackPressed() {
}

private final SensorEventListener mSensorListener = new SensorEventListener() {

    public void onSensorChanged(SensorEvent se) {
        float x = se.values[0];
        float y = se.values[1];
        float z = se.values[2];
        mAccelLast = mAccelCurrent;
        mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
        float delta = mAccelCurrent - mAccelLast;
        mAccel = mAccel * 0.9f + delta; // perform low-cut filter

        SharedPreferences getPrefs = PreferenceManager
                .getDefaultSharedPreferences(getBaseContext());
        boolean checkSense1 = getPrefs.getBoolean("sensi1", true);
        boolean checkSense2 = getPrefs.getBoolean("sensi2", false);

        if (checkSense1 == true) {
            sensibility = 1.25f;
        }

        if (checkSense2 == true) {
            sensibility = 0.75f;
        }

        // Prüft die Beschleunigung
        if (mAccel > sensibility) {
            Intent gameOver = new Intent("android.intent.action.BOOM");
            startActivity(gameOver);
        }
        if (isOver == true) {
            Intent gameOver = new Intent("android.intent.action.BOOM");
            startActivity(gameOver);
        }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

@Override
protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(mSensorListener,
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
    mSensorManager.unregisterListener(mSensorListener);
    super.onPause();
    finish();
}
    }
4

1 に答える 1

1

while 条件を更新するだけです

while (!isOver) {
}
于 2013-09-09T12:47:06.213 に答える