Timer.cancel()没有取消定时器

时间:2016-04-03 17:28:42

标签: android timer

如果我取消它,我的计时器不会停止运行! 如果我关闭整个应用程序,Timer只会停止!

我不知道为什么Timer没有被取消。如果我打印出每次取消定时器的尝试我会得到线条的数据但​​是定时器不会停止!

我的班级:

public class PlayActivity extends AppCompatActivity
        implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaplayerEvent {

    //region Activity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Initialize_Layout();
        Initialize_Objects();
    }

    @Override
    protected void onResume() {
        super.onResume();

        MusicService.setMediaPlayerEvent(this);

        txvSongtitle.setText(serviceInterface.MP_getActualSong().getTitle());

        Start_Timer();
    }

    @Override
    protected void onPause() {
        timer.cancel();

        MusicService.clearMediaPlayerEvent();

        super.onPause();
    }

    @Override
    public boolean onSupportNavigateUp() {
        finish();

        return super.onSupportNavigateUp();
    }

    //endregion

    //region Methods

    private void Start_Timer() {
        timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (serviceInterface.MP_isPlaying()) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            seekBar.setMax(serviceInterface.MP_getDuration());
                            seekBar.setProgress(serviceInterface.MP_getCurrentPosition());
                        }
                    });
                }
                else {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            timer.cancel();
                        }
                    });
                }
            }
        }, 0, 200);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        if (fromUser) {
            serviceInterface.MP_seekTo(progress);

            Start_Timer();
        }
    }

    //endregion
}

我希望你能帮助我! 谢谢!

2 个答案:

答案 0 :(得分:0)

您正在创建并启动用户移动搜索栏的新计时器(在onProgressChanged()中)。这也意味着你失去了对旧的参考。当isPlaying变为false时,所有计时器都会尝试取消timer - 仅引用最新的计时器。

答案 1 :(得分:0)

我建议使用Thread代替计时器。您的Start_Timer()代码将更改为以下内容:

private Thread mTimerThread;

...

private void Start_Timer() {
    mTimerThread = new Thread() {
        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    if (serviceInterface.MP_isPlaying()) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                seekBar.setMax(serviceInterface.MP_getDuration());                       
                                seekBar.setProgress(serviceInterface.MP_getCurrentPosition());
                            }
                        });
                    } else {
                        interrupt();
                    }
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) {
            }
        }
    }
    mTimerThread.start();
}

线程更高效,更轻便,完美满足您的需求。另外,通过将Thread设置为全局变量,您可以确保在Android生命周期事件期间调用mTimerThread.interrupt();,例如onPause()

我希望这可以解决您的问题。请记住,Java Thread是你的朋友!