YouTubePlayerFragment 后台堆栈

YouTubePlayerFragment backstack

我想在我的 activity 中使用 YouTubePlayerFragment 和 backstack。因此,当我按下后退按钮时,片段会消失,并且在以后的某些操作中(例如单击按钮)会再次出现在另一个视频中。这是我的代码

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");
}

}

当我在该片段初始化后回击并单击按钮时,我看到拇指,但视频无法播放,只有无限旋转进度和 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)

似乎 YouTubePlayer 在后按时发布有问题。 也许我做错了什么?

我找到了解决方法:我将来自 onInitializationSuccess 的 YouTubePlayer 实例存储在我的 Activity 中,并在新片段初始化之前对其调用 release() ,之后一切正常并且日志中没有错误猫。

我扩展了 YouTubePlayerSupportFragment 以存储播放器实例并在 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();
        }
    }