0

我有几个不同的活动,每个活动都有一个 MediaPlayer 和一个 OnCompletionListener 来在当前文件停止播放后启动其他活动。OnCompletion 侦听器中还内置了一个延迟,我通过一个带有 postDelayed 的处理程序来实现它,它看起来像这样:

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;
    }
4

1 回答 1

3

当您不想执行处理程序的回调时,您必须取消它。

在您的活动范围内定义您的处理程序(因为您必须达到它)。像这样的东西:

public class MainActivity extends Activity {

    Handler handler = new Handler();
    Runnable myRunnable;
        ...
}

并在您的活动中定义您的可运行文件(可能在您的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);
于 2013-11-23T18:13:50.233 回答