后退按钮不会停止处理程序

时间:2016-06-24 08:57:48

标签: android

我有一项运行以下内容的活动:

    private void loop() {
            // TODO Auto-generated method stub

            handler.postDelayed(new Runnable() { 
            public void run() { 

            DBListern(); 
            handler.postDelayed(this, 5000);
        }
    }, 5000); 

}

我想在后退按钮上取消此句柄:

    public boolean onBackPress(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        handler.removeCallbacksAndMessages(null);

        return true;

    }

    return super.onKeyDown(keyCode, event);

}

按下后退按钮后处理程序仍在运行,我该如何阻止它?

5 个答案:

答案 0 :(得分:2)

首先,您要查找的方法的正确名称是onBackPressed()。所以你的代码根本没有被框架调用。尝试

@Override
public void onBackPressed() {
    handler.removeCallbacksAndMessages(null);

    super.onBackPressed();
}

答案 1 :(得分:1)

你需要这样做:

@Override
public void onBackPressed() {
    if(mHandler!=null){
        mHandler.removeCallbacks(mRunnable);
    }
    super.onBackPressed();        
}

原因:您需要从Runnable onBackPress手动删除Handler的回调。

希望这会对你有所帮助。

答案 2 :(得分:0)

公共类MainActivity扩展AppCompatActivity {     private static final String TAG = MainActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loop();
}

private void loop() {
    // TODO Auto-generated method stub

    handler.postDelayed(new Runnable() {
        public void run() {

           Log.i(TAG,"run");
            handler.postDelayed(this, 5000);
        }
    }, 5000);

}

Handler handler = new Handler();

@Override
public void onBackPressed() {
    super.onBackPressed();
    handler.removeCallbacksAndMessages(null);
}

}

这适合我。

答案 3 :(得分:-1)

对于删除的处理程序消息,您需要在方法参数中设置not null。它必须是对象或消息类型,你喜欢删除什么。为什么你做这个chek if (keyCode == KeyEvent.KEYCODE_BACK) {

它真的很重要吗?

答案 4 :(得分:-1)

我想如果你想每隔几秒钟执行一些东西,你可能需要这样的Timer类:

import android.os.Handler;

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}

您的代码有什么不好之处在于您将这些非常低级别的定时器代码与高级活动代码放在一起。我认为你应该开一个新课来处理这些事情。

从我的计时器类中可以看到,它有一个paused字段。每次想要执行runnable时,它都会检查它是否被暂停。如果不是,请继续。

在您的活动中,您只需在onCreate中创建一个计时器,并在适当时调用startTimer()。它真的很容易使用!

按下后退按钮时会调用一个方法。那是onBackPressed()。所以你只需要做这样的事情:

@Override
public void onBackPressed() {
    super.onBackPressed();
    timer.stopTimer();
}

您也可以在任何时候设置计时器的间隔!