YouTubePlayerFragment backstack

I want to use YouTubePlayerFragment in my activity with backstack. Therefore, when I press the button, the button fragment disappears and in some future actions (for example, pressing the button) appears again with another video. Here is 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 press the button after this fragment is initialized, I see a thumb, but the video does not play, only the endless course of rotation and obfuscation of 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) 

There seems to be some issue with releasing YouTubePlayer when clicked back. Maybe I'm doing something wrong?

I found a workaround: I store the YouTubePlayer instance from onInitializationSuccess in my activity and call release () on it before re-initializing the fragment, and after that everything goes right, and there are no errors in the log cat.

+2
source share
1 answer

I am expanding YouTubePlayerSupportFragment to store the player instance and release it correctly 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(); } } 
+2
source

Source: https://habr.com/ru/post/1233140/


All Articles