0

現在のファイルの再生が停止した後に他のアクティビティを開始するために、それぞれ MediaPlayer と OnCompletionListener を持ついくつかの異なるアクティビティがあります。postDelayed を使用してハンドラーを介して達成する OnCompletion リスナーに組み込まれた遅延もあり、次のようになります。

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 を呼び出すと、次に来るアクティビティに切り替わることがあることです。だから私はそれが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 に答える