【问题标题】:Stopping a running handler停止正在运行的处理程序
【发布时间】:2015-04-24 09:12:36
【问题描述】:

我已经实现了一个处理程序,它允许用户使用任务栏菜单启动一个每 5 秒重复一次的事件。还允许用户从任务栏菜单停止事件的最佳方法是什么?

public class MainActivity extends Activity{ 
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.menuitem_tracklogOn:
            final Handler handler = new Handler();
            Timer t = new Timer();
            t.schedule(new TimerTask() {
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {
                            //DO SOME ACTIONS HERE , THIS ACTIONS WILL WILL EXECUTE AFTER 5 SECONDS...
                            handler.postDelayed(this, 5000);//repeat every n-milliseconds
                        }
                    });
                }
            }, 0);//start after n-milliseconds
            return true;

       case R.id.menuitem_tracklogOff:
       //stops running event from R.id.menuitem_tracklogOn
       return true;

解决办法:

final Handler handler = new Handler();
Timer t = new Timer();
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.menuitem_tracklogOn:
            t.schedule(new TimerTask() {
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {
                            //DO SOME ACTIONS HERE , THIS ACTIONS WILL WILL EXECUTE AFTER 5 SECONDS...
                            handler.postDelayed(this, 5000);//repeat every n-milliseconds
                        }
                    });
                }
            }, 2000);//start after n-milliseconds
            return true;
        case R.id.menuitem_tracklogOff:
            t.cancel();
            handler.removeCallbacksAndMessages(null);
            return true;

【问题讨论】:

    标签: android timer android-handler


    【解决方案1】:

    您需要致电timer.cancel() 取消您的计时器。

    public void cancel() // Added in API level 1

    取消定时器和所有计划任务。如果有当前正在运行的任务,则不受影响。不能在此计时器上安排更多任务。后续调用什么都不做。

    【讨论】:

      【解决方案2】:

      什么是最好的使用方法,也可以让用户停下来 任务栏菜单中的事件?

      在menuitem_tracklogOff 上停止Handler 点击:

      1.通过调用timer.cancel()取消Timer

      2. 调用removeCallbacksAndMessages 删除所有回调和消息:

      handler.removeCallbacksAndMessages(null);
      

      要访问Timer 和Handler 对象的外部首先case 声明其他外部onOptionsItemSelected 方法或switch-case 块之前。

      【讨论】:

      • @ρяσѕρєя-k- 我已经在上面发布了您实施的建议......我错过了什么?谢谢!
      • @portsample: 将两个final Handler handler = new Handler();Timer t = new Timer(); 行移到onOptionsItemSelected 方法之外
      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2015-03-08
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多