2017-05-31 59 views
0

我在活动安排timeatsk两次(点击按钮两次),像这样:Timer.schedule在活动不同,广播接收器

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.btn_timer: 
      addTimer(); 
      break; 
    } 
} 
private void addTimer(){ 
    Log.e("----","------"+Thread.currentThread().getName()); 
    if(timerTask == null){ 
     timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       timerCount++; 
       Log.e("----","------=="+Thread.currentThread().getName()); 
       Log.e("------","------"+timerCount); 
      } 
     }; 
    } 
    if(timer == null){ 
     timer = new Timer(); 
     timer.schedule(timerTask,1000,1000); 
    } 
} 

结果是:

the right result

但我schedue BroadcastReceiver中的相同任务两次(单击按钮两次): inActivity:

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.btn_timer: 
      Intent intent = new Intent(); 
      intent.setAction("timer"); 
      this.sendBroadcast(intent); 
      break; 
    } 
} 

in broadcastReceiver:` @Override public void onReceive(Context context,Intent intent){ addTimer(); }

private void addTimer(){ 
    Log.e("----",Thread.currentThread().getName()); 
    if(timerTask == null){ 
     timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       timerCount++; 
       Log.e("----","------=="+Thread.currentThread().getName()); 
       Log.e("------","------"+timerCount); 
      } 
     }; 
    } 
    if(timer == null){ 
     timer = new Timer(); 
     timer.schedule(timerTask,1000,1000); 
    } 
}` 

但结果是 in two thread!

回答

0

正在发生的事情是,你只需要你的活动的一个实例,所以你打电话addTimer()timerTasktimer非空,第二次(因为你已经在第一次点击时分配了它们)。因此你只有一个计时器。

每次发送广播时,都会创建一个新的广播接收器实例。每个实例将创建它自己的timerTasktimer(因为它们为空)。因此,你最终会得到多个定时器。

你实际上想用这些计时器实现什么?

+0

我使用计时器来计算我播放视频的时间以及向服务报告秒数。视频将停止并开始多次,所以应该发送多个广播。如何解决问题? – shumengma

+0

然后,您应该将秒发送到服务,而不是在服务中启动计时器。你为什么需要一个计时器?你为什么不简单地在“Date”变量中记录开始时间,然后计算视频停止播放时的播放时间。 – gjsalot

+0

谢谢你,单题集是工作 – shumengma