首先handler的写法(不要写成非静态内部类,它会持有外部类的引用,内部类实例化后不释放的话那外部类也不释放)
正确写法如下:
MyHandler handler = new MyHandler(this);
private static class MyHandler extends Handler {
private WeakReference<PlayActivity> activityWeakReference;
public MyHandler(PlayActivity activity) {
activityWeakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
PlayActivity activity = activityWeakReference.get();
if (activity != null) {
//处理handler消息,本次用不到
}
}
}
然后是循环写法
写法1:
(和写法2一样的,只不过把方法体拿出来封装成一个新方法,看起来更好,推荐此写法)
private void updateProgressBar(ExoPlayer player, SeekBar seekBar, Handler handler) {
Log.e(TAG, "updateProgressBar: ");
long position = player == null ? 0 : player.getCurrentPosition();
int currentMediaIndex = player == null ? 0 : player.getCurrentMediaItemIndex();
if (!dragging) {
seekBar.setProgress(progressBarValue(position, currentMediaIndex, totalDuration));
}
long delayMs = 1000;
handler.postDelayed(updateProgressAction, delayMs);
}
private final Runnable updateProgressAction = new Runnable() {
@Override
public void run() {
updateProgressBar(exoPlayer, mSeekBar, handler);
}
};
然后找个地方去执行就行了:updateProgressBar(exoPlayer, mSeekBar, handler);
记得取消:
if (handler != null) {
handler.removeCallbacks(updateProgressAction);
}
写法2:
Runnable runnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作
handler.postDelayed(this, 2000);
}};
- 主线程中调用,使用PostDelayed方法,两秒后调用此Runnable对象
handler.postDelayed(runnable, 2000);