java.lang.IllegalStateException:使用YouTubePlayerApi时,YouTubeServiceEntity未初始化错误

Gml*_*alo 34 android youtube-api

我在我的应用中使用了YouTubePlayerAPIYouTubePlayerSupportFragment,但是我收到了以下错误,但我找不到导致它的原因.我一直在寻找信息,但我没有找到任何有用的东西.

java.lang.IllegalStateException: YouTubeServiceEntity not initialized
    at android.os.Parcel.readException(Parcel.java:1433)
    at android.os.Parcel.readException(Parcel.java:1379)
    at com.google.android.youtube.player.internal.l$a$a.a(Unknown Source)
    at com.google.android.youtube.player.internal.o.a(Unknown Source)
    at com.google.android.youtube.player.internal.ad.a(Unknown Source)
    at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source)
    at com.google.android.youtube.player.YouTubePlayerView$1.a(Unknown Source)
    at com.google.android.youtube.player.internal.r.g(Unknown Source)
    at com.google.android.youtube.player.internal.r$c.a(Unknown Source)
    at com.google.android.youtube.player.internal.r$b.a(Unknown Source)
    at com.google.android.youtube.player.internal.r$a.handleMessage(Unknown Source)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

在stackstrace中,没有任何行号指向我的任何类或活动.

有什么想法吗?

谢谢!

编辑

我的自定义YoutubePlayerFragment类:YouTubeVideoPlayerFragment.java

public class YouTubeVideoPlayerFragment extends YouTubePlayerSupportFragment {


private static final String ARG_URL = "url";


// ===========================================================
// Constructors
// ===========================================================

/**
 * Mandatory empty constructor for the fragment manager to instantiate the
 * fragment (e.g. upon screen orientation changes).
 */
public YouTubeVideoPlayerFragment() {
}

/**
 * Factory method to generate a new instance of the fragment given a video URL.
 *
 * @param url The video url this fragment represents
 * @return A new instance of this fragment with itemId extras
 */
public static YouTubeVideoPlayerFragment newInstance(String url) {
    final YouTubeVideoPlayerFragment mFragment = new YouTubeVideoPlayerFragment();

    // Set up extras
    final Bundle args = new Bundle();
    args.putString(ARG_URL, url);
    mFragment.setArguments(args);

    // Initialize YouTubePlayer
    mFragment.init();

    return mFragment;
}



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

private void init(){
    initialize(Constants.API_KEY, new YouTubePlayer.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
            if (!wasRestored) {
                youTubePlayer.cueVideo(getArguments().getString(ARG_URL));
                youTubePlayer.setShowFullscreenButton(false);
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

fragment.xml之

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:background="@color/black" >

    <!-- For YoutubeFragment -->
    <FrameLayout
        android:id="@+id/youtube_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

调用方法:

// Create a new instance of YouTubeVideoPlayerFragment providing video id
        // and place it in the corresponding FrameLayout
        final YouTubeVideoPlayerFragment youTubeVideoPlayerFragment = YouTubeVideoPlayerFragment.newInstance(VIDEO_ID);
        final FragmentTransaction ft = getChildFragmentManager().beginTransaction();
        ft.replace(R.id.youtube_fragment, youTubeVideoPlayerFragment);
        ft.commit();
Run Code Online (Sandbox Code Playgroud)

编辑

我发现了那个错误的起源.这是场景:

活动开始了.在onCreate()其实例中,在其方法中实例化一个新的YouTubeVideoPlayerFragment并初始化的YouTube对象(在YouTubeServiceEntity内部启动)newInstance().然后YouTube,在加载视频的同时将之前实例化的片段附加FragmentManager到相应的片段FrameLayout.

问题如下:如果用户在加载视频之前退出活动,则抛出异常.

因此,如果用户想要在这种情况下退出活动,我该怎么做以及如何做?我真的不知道该怎么办!

Eug*_*nec 4

再次强调,不要使用片段构造函数或工厂方法来处理生命周期或上下文绑定实体。super.onCreate(...)简单地说,此类实体只有在被调用后才能使用。

现在的问题是,什么时候调用该init方法?

YouTubePlayerFragment文档是这样说的:

每当调用该片段的方法时,与该片段关联YouTubePlayer的 都会被释放。onDestroyView()因此,每当重新创建与此片段关联的活动时,您都必须重新调用initialize(String, YouTubePlayer.OnInitializedListener),即使通过设置在重新创建活动期间保留片段实例也是如此setRetainInstance(boolean)

您可能想放入init()onActivityCreated但为时已晚,因为onStart已经调用并且布局已经执行。

对应的是onDestroyViewis onViewCreated,that 是完美的候选者。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    init();
}
Run Code Online (Sandbox Code Playgroud)

按照建议setRetainInstance(true)在片段的构造函数中调用。重新创建 Activity 时,不会重新创建 Fragment,只有其 UI 会经历生命周期事件。