java.lang.IllegalStateException: YouTubePlayerApi 使用時に YouTubeServiceEntity が初期化されていないというエラーが発生する 質問する

java.lang.IllegalStateException: YouTubePlayerApi 使用時に YouTubeServiceEntity が初期化されていないというエラーが発生する 質問する

私は使用していますYouTubeプレーヤーAPIそしてYouTube プレーヤー サポート フラグメントアプリで次のエラーが発生していますが、原因がわかりません。情報を探しましたが、役立つものは見つかりませんでした。

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)

スタックトレースには、クラスやアクティビティを指す行番号がありません。

何か考えはありますか?

ありがとう!

編集

私のカスタムYoutubeプレーヤーフラグメントクラス: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);
            }
    }
}

フラグメント.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>

呼び出し方法:

// 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();

編集

そのエラーの原因が分かりました。シナリオは次のとおりです。

アクティビティが始まります。onCreate()新しいインスタンスを作成しYouTubeVideoPlayerFragment、初期化します。ユーチューブオブジェクト (YouTubeServiceEntity内部的に を開始します) をそのメソッドで実行しますnewInstance()。次に、ビデオの読み込み中に、以前にインスタンス化されたフラグメントが対応するオブジェクトにYouTubeアタッチされます。FragmentManagerFrameLayout

問題は次のとおりです:ビデオが読み込まれる前にユーザーがアクティビティを終了すると、例外がスローされます。

では、その場合にユーザーがアクティビティを終了したい場合は、何をどうすればいいのでしょうか? 何をすればいいのかよくわかりません!

ベストアンサー1

もう一度言いますが、ライフサイクルまたはコンテキストにバインドされたエンティティを操作するためにフラグメント コンストラクターまたはファクトリ メソッドを使用しないでください。簡単に言うと、このようなエンティティは、がsuper.onCreate(...)呼び出された後にのみ使用できます。

ここで問題になるのは、initメソッドをいつ呼び出すかということです。

これがYouTubePlayerFragmentドキュメンテーション言う:

このフラグメントに関連付けられているはYouTubePlayer、その メソッドが呼び出されるたびに解放されますonDestroyView()。したがって、initialize(String, YouTubePlayer.OnInitializedListener)を設定することでフラグメント インスタンスがアクティビティの再作成後も保持される場合でも、このフラグメントに関連付けられているアクティビティが再作成されるたびに を再度呼び出す必要がありますsetRetainInstance(boolean)

init()入れたくなるかもしれませんが、すでに呼び出され、レイアウトが実行されているonActivityCreatedので、それは遅すぎます。onStart

対応するものはでonDestroyViewありonViewCreated、それが完璧な候補です。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    init();
}

提案されているように、フラグメントのコンストラクターで呼び出しますsetRetainInstance(true)。アクティビティが再作成されると、フラグメントは再作成されず、その UI のみがライフサイクル イベントを通過します。

おすすめ記事