使用Handler和Runnable的正确方法是什么?

时间:2018-10-24 08:15:27

标签: android

我正在开发一个Android应用程序,我想每40毫秒调用一次函数。为此,我实现了一个处理程序和一个Runnable。由于帖子How to run a method every X seconds,我选择了这两个对象。但是我不确定这是执行我正在做的事情的正确方法:

在我的应用程序中,我正在播放视频,我想在启动视频时“启动”处理程序,在暂停视频时“暂停”,在恢复视频时再次启动,等等。

到目前为止,我正在使用mHandler.removeCallbacks(mRunnable);进行扣留。但是要启动或恢复它,我不知道该使用mHandler.post(mRunnable); mHandler.postDelay(mRunnable, DELAY)还是mRunnable.run();。我成功地使它们全部正常工作,但是行为却从未达到预期的水平……

这是我用来设置处理程序的代码...

public void setUpdatePositionHandler() {
    mHandler = new Handler();
    mRunnable = new Runnable() {
        @Override
        public void run() {
            if (mVideoView.getCurrentPosition() > mVideoView.getDuration()) {
                if (mVideoView.getCurrentPosition() > 1000) {
                    mVideoView.seekTo(1); // go back to beginning
                    mVideoView.pause();
                    mPlayButton.setVisibility(View.VISIBLE);
                    mStampIndex = 0;
                    mLastPosition = 0;
                    Log.i(TAG, "removeCallbacks() from runnable");
                    mHandler.removeCallbacks(this);
                } else {
                    //mHandler.postDelayed(this, DELAY);
                }
            } else {
                if (!mStamps.isEmpty()) {
                    onPositionUpdate(mStamps);
                }
                mHandler.postDelayed(this, DELAY);
            }
        }
    };

请注意,我不太确定自己到目前为止已经实现了什么,欢迎任何可以帮助我更好地理解的资源:)(我已经阅读了这两个类的文档,并阅读了一些文档或帖子。关于主题,但我想我缺少了一些东西。)

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

这是正确的方法吗? 如果它不会产生任何问题并且满足您的要求,那么可以 但您的问题应该是最佳做法吗? 我更喜欢像下面这样写

public void setUpdatePositionHandler() {
    mHandler = new Handler();
    mRunnable = new Runnable() {
        @Override
        public void run() {
            if (mVideoView.getCurrentPosition() > mVideoView.getDuration()) {
                if (mVideoView.getCurrentPosition() > 1000) {
                    mVideoView.seekTo(1); // go back to beginning
                    mVideoView.pause();
                    mPlayButton.setVisibility(View.VISIBLE);
                    mStampIndex = 0;
                    mLastPosition = 0;
                    Log.i(TAG, "removeCallbacks() from runnable");
                    mHandler.removeCallbacks(this);
                } else {
                    //mHandler.postDelayed(this, DELAY);
                }
            } else {
                if (!mStamps.isEmpty()) {
                    onPositionUpdate(mStamps);
                }
            }
        }
         mHandler.postDelayed(mRunnable, DELAY);
    };

请注意,如果您使CountDownTimer或者可以将Thread.sleep()与常规循环和 AsyncTask 一起使用,以防止不阻止您的代码,则上述代码仅会起作用一次应用程序将没有响应,然后您的应用程序将被抓取