2017-05-31 25 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