我有几个不同的Activity,每个Activity都有一个MediaPlayer和一个OnCompletionListener,可以在当前文件停止播放后启动其他活动。在OnCompletion Listener中还有一个延迟,我通过带有postDelayed的Handler来实现它,它看起来像这样:
public void onCompletion(MediaPlayer mp) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
try {
Intent stopplay;
stopplay = new Intent(actualActivity, Class
.forName(nextView));
actualActivity.startActivity(stopplay);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, stopTime);
}
这个问题是,当我调用我的SettingsActivity时,有时它只是切换到接下来会发生的Activity。所以我认为它挂在postDelayd的等待......
我怎么能绕过这个?
我也在这些活动的onStop,onPause和onDestroy中执行此操作:
if (mPlayer != null) {
mPlayer.stop();
mPlayer.release();
mPlayer = null;
}
答案 0 :(得分:3)
当您不希望执行回调时,您必须取消处理程序的回调。
在您的活动范围内定义您的处理程序(因为您必须到达它)。像这样:
public class MainActivity extends Activity {
Handler handler = new Handler();
Runnable myRunnable;
...
}
并在您的活动中定义您的runnable(可能在您onCreate
方法内)
myRunnable = new Runnable() {
@Override
public void run() {
try {
Intent stopplay;
stopplay = new Intent(actualActivity, Class
.forName(nextView));
actualActivity.startActivity(stopplay);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
更改您的代码:
handler.removeCallbacks(myRunnable);
handler.postDelayed(myRunnable, stopTime);
如果你想取消它,试试这个:
handler.removeCallbacks(myRunnable);