2015-02-23 73 views
0

我已经实现了一个处理程序,允许用户使用任务栏菜单启动每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; 

回答

1

有什么用,这也将允许用户停止 从任务栏菜单的情况下最好的方法是什么?

要在menuitem_tracklogOff单击停止Handler

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

2.呼叫removeCallbacksAndMessages以清除所有的回调和消息:

handler.removeCallbacksAndMessages(null); 

访问s既TimerHandler对象的第一个外部case声明其他外部onOptionsItemSelected方法或switch-case块之前。

+0

@ρяσѕρєя-k-我已经在上面发布了您实施的建议...我错过了什么?谢谢! – portsample 2015-02-23 05:26:38

+0

@portsample:同时移动'最后的处理程序处理程序=新的处理程序();定时器t =新的定时器();'线外'onOptionsItemSelected'方法 – 2015-02-23 05:29:43

0

你需要调用timer.cancel()取消计时器。

公共无效取消()// Added in API level 1

取消定时器和所有预定任务。如果当前正在运行的任务不受影响。此定时器上不能再安排更多任务。随后的通话什么都不做。