使用可运行处理程序的if语句

时间:2019-02-27 12:35:25

标签: java android if-statement runnable

我正在创建一个android应用程序,并使用地震https://github.com/square/seismic库添加了震动功能

使用此摇动功能,我正在尝试使其根据每次摇动的次数打开相应的页面,即,对第1页摇动一次,对第2页摇动两次,依此类推。

我正在使用一个处理程序在启动int()语句之前等待1700毫秒,因此它知道正确的计数,而不是直接转到第一个if语句(计数为1时),但是它仍然从第1页转到从第2页到第3页,而不是第一次等待并进入正确的页面。

家庭教室

if

ShakeDetector类

mShakeDetector.setOnShakeListener(new com.example.name.project.ShakeDetector.OnShakeListener() {

            @Override
            public void onShake(final int count) {
                System.out.println(count);

                final Intent tts = new Intent(context, ttsScreen.class);
                final Intent stt = new Intent(context, sttScreen.class);
                final Intent cbb = new Intent(context, cbbScreen.class);
                final Intent ocr = new Intent(context, ocrScreen.class);

                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                        if( count == 1 ) {
                            startActivity(tts);
                        }
                        else if (count == 2) {
                            startActivity(stt);
                        }
                        else if (count == 3) {
                            startActivity(cbb);
                        }
                        else if (count == 4) {
                            startActivity(ocr);
                        }
                    }
                }, 1800);



            }
        });

因此,基本上,抖动检测器类在重置之前会先注册3秒钟的抖动计数,这很好,但是现在在我的Home类中,我希望它注册我的抖动并等待X秒,然后正确打开该类,但是我不确定我的方法错了吗?

我添加了一个不计其数的系统,它的检测效果很好

import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.FloatMath; public class ShakeDetector implements SensorEventListener { /* * The gForce that is necessary to register as shake. * Must be greater than 1G (one earth gravity unit). * You can install "G-Force", by Blake La Pierre * from the Google Play Store and run it to see how * many G's it takes to register a shake */ private static final float SHAKE_THRESHOLD_GRAVITY = 2.7F; private static final int SHAKE_SLOP_TIME_MS = 500; private static final int SHAKE_COUNT_RESET_TIME_MS = 3000; private OnShakeListener mListener; private long mShakeTimestamp; private int mShakeCount; public void setOnShakeListener(OnShakeListener listener) { this.mListener = listener; } public interface OnShakeListener { public void onShake(int count); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // ignore } @Override public void onSensorChanged(SensorEvent event) { if (mListener != null) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; float gX = x / SensorManager.GRAVITY_EARTH; float gY = y / SensorManager.GRAVITY_EARTH; float gZ = z / SensorManager.GRAVITY_EARTH; // gForce will be close to 1 when there is no movement. float gForce = (float)Math.sqrt( gX * gX + gY * gY + gZ * gZ ); if (gForce > SHAKE_THRESHOLD_GRAVITY) { final long now = System.currentTimeMillis(); // ignore shake events too close to each other (500ms) if (mShakeTimestamp + SHAKE_SLOP_TIME_MS > now) { return; } // reset the shake count after 3 seconds of no shakes if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) { mShakeCount = 0; } mShakeTimestamp = now; mShakeCount++; mListener.onShake(mShakeCount); } } } }

但是它从第1页到第2页再到第3页(您可以看到转换);是什么原因呢?

2 个答案:

答案 0 :(得分:3)

onShake每次震动都多次呼叫。 这里的第一个问题是您每次都发布一个Runnable,但是调用了onShake(),但是您没有取消最后一个。因此,您需要先取消队列中的最后一个Runnable,然后再发布新的队列。 试用以下代码:-

public class MainActivity extends AppCompatActivity {
private int shakeCount=0;
private Runnable runnable ;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    runnable =new Runnable() {
        public void run() {
            if( shakeCount == 1 ) {
                final Intent tts = new Intent(context, ttsScreen.class);
                startActivity(tts);
            }
            else if (shakeCount == 2) {
                final Intent stt = new Intent(context, sttScreen.class);
                startActivity(stt);
            }
            else if (shakeCount == 3) {
                final Intent cbb = new Intent(context, cbbScreen.class);
                startActivity(cbb);
            }
            else if (shakeCount == 4) {
                final Intent ocr = new Intent(context, ocrScreen.class);
                startActivity(ocr);
            }
            shakeCount=0;
        }
    };
    mShakeDetector.setOnShakeListener(new com.example.name.project.ShakeDetector.OnShakeListener() {
        @Override
        public void onShake(final int count) {
            shakeCount=count;
            handler.removeCallbacks(runnable);
            handler.postDelayed(runnable, 1800);

    });
}

我仅出于区分局部变量和全局变量的目的而在其中放置了一个Activity类。

答案 1 :(得分:0)

我相信您将超时时间设置在了错误的位置。每当计数增加时,您就会触发该事件3次。

您的OnShakeListener应该保留该计数。 onShake应该负责更新侦听器中的计数,并在超时后触发处理程序并重置摇动计数。