Timer.schedule在Activity和BroadcastReceiver中有所不同

时间:2017-05-31 17:43:34

标签: android

我在活动中安排了两次timeatsk(单击按钮两次),如下所示:

@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

但是我在BroadcastReceiver中调试了两次相同的任务(单击按钮两次): 不活动:

 @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;
    }
}
广播收发器中的

:`     @覆盖     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!

1 个答案:

答案 0 :(得分:0)

正在发生的事情是,您只有一个活动实例,因此第二次调用addTimer()时,timerTasktimer非空(因为您已经分配了它们)在第一次点击)。因此,您只有一个计时器。

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

你真的想用这些计时器实现什么目标?