2015-11-04 2 views
2

Я хочу использовать YouTubePlayerFragment в своей деятельности с помощью backstack. Поэтому, когда я нажимаю кнопку, фрагмент кнопки исчезает и в некоторых действиях в будущем (например, нажатие кнопки) появляется снова с другим видео. Вот мой код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 при обратном нажатии. Возможно, я что-то делаю неправильно?

Я нашел обходное решение: Я храню экземпляр YouTubePlayer из onInitializationSuccess в своей деятельности и вызываю release() на нем перед новой инициализацией фрагмента, и после этого все идет правильно, и ошибок в log cat нет.

ответ

2

Я простираться 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(); 
     } 
    } 
Смежные вопросы