我想在我的活动中使用YouTubePlayerFragment。所以当我按下后退按钮时,片段消失了,在未来的某个动作中(例如点击按钮)会再次出现另一个视频。这是我的代码
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实例存储在我的活动中,并在新的Fragment初始化之前对其调用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();
}
}