我正在开发一个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);
}
}
};
请注意,我不太确定自己到目前为止已经实现了什么,欢迎任何可以帮助我更好地理解的资源:)(我已经阅读了这两个类的文档,并阅读了一些文档或帖子。关于主题,但我想我缺少了一些东西。)
谢谢您的帮助
答案 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 一起使用,以防止不阻止您的代码,则上述代码仅会起作用一次应用程序将没有响应,然后您的应用程序将被抓取