Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

YouTubePlayerFragment backstack

I want to use YouTubePlayerFragment in my activity with backstack. So when I press back button fragment disappears and on some action in future (button click for example) appears again with another video. Here's my code

public class YouTubeTestActivity extends Activity implements YouTubePlayer.OnInitializedListener {

@OnClick(R.id.button)
public void click(){
    init();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    ButterKnife.inject(this);

    init();

}

private void init() {

    YouTubePlayerFragment f = YouTubePlayerFragment.newInstance();
    f.initialize(DeveloperKey.KEY, this);
    getFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.frame,f).commit();
}

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
   youTubePlayer.loadVideo("O4sXdktFDEM");
}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
    Toasts.fromText(this, "ERROR");
}

}

When i hit back and click button after that fragment initialized, i see thumb, but video doesn't play, only infinite spinning progress and obfuscated errors in logcat:

    11-04 16:30:52.597 8530-8530/? W/MessageQueue: Handler (android.os.Handler) {d856ff1} sending message to a Handler on a dead thread
11-04 16:30:52.597 8530-8530/? W/MessageQueue: java.lang.IllegalStateException: Handler (android.os.Handler) {d856ff1} sending message to a Handler on a dead thread
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.enqueueMessage(Handler.java:631)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.sendMessageAtTime(Handler.java:600)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.sendMessageDelayed(Handler.java:570)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.sendEmptyMessageDelayed(Handler.java:534)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.sendEmptyMessage(Handler.java:519)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at ken.a(SourceFile:792)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at kei.g(SourceFile:554)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at keq.g(SourceFile:146)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at lcu.c(SourceFile:488)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at lwr.b(SourceFile:245)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at lwy.b(SourceFile:148)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at ldd.a(SourceFile:694)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at alm.a(SourceFile:267)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at alm.b(SourceFile:287)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at auc.run(SourceFile:209)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.handleCallback(Handler.java:739)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.os.Looper.loop(Looper.java:148)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at java.lang.reflect.Method.invoke(Native Method)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-04 16:30:52.597 8530-8530/? W/MessageQueue:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

It seems there is some problem with YouTubePlayer release on back press. Maybe I'm doing something wrong?

I've found workaround: I'm storing YouTubePlayer instance from onInitializationSuccess in my Activity and call release() on it before new Fragment initialization and after that all goes right and there is no errors in log cat.

like image 960
Kolchuga Avatar asked Dec 10 '25 23:12

Kolchuga


1 Answers

I've extend YouTubePlayerSupportFragment to store player instance and correctly release it in onDestroyView

public class YouTubePlayerFragment2 extends YouTubePlayerSupportFragment {
        private YouTubePlayer mPlayer;



        public static YouTubePlayerFragment2 newInstance(){
            return new YouTubePlayerFragment2();
        }

        @Override
        public void initialize(String s, YouTubePlayer.OnInitializedListener onInitializedListener) {
            YouTubePlayer.OnInitializedListener listener = new YouTubePlayer.OnInitializedListener() {
                @Override
                public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
                    onInitializedListener.onInitializationSuccess(provider, youTubePlayer, b);
                    mPlayer = youTubePlayer;
                    mPlayer.setShowFullscreenButton(false);
                }

                @Override
                public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                    onInitializedListener.onInitializationFailure(provider, youTubeInitializationResult);
                }
            };
            super.initialize(s, listener);
        }

        @Override
        public void onDestroyView() {
            if(mPlayer!=null) {

                mPlayer.release();
            }
            super.onDestroyView();
        }
    }
like image 119
Kolchuga Avatar answered Dec 13 '25 12:12

Kolchuga



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!