问题
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.
回答1:
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();
}
}
来源:https://stackoverflow.com/questions/33521198/youtubeplayerfragment-backstack