问题
Every time I remove the YouTubePlayerSupportFragment
from the back stack, I get the error below in the logcat:
06-12 02:08:46.937 8805-8805/ D/GA_DEBUG: Event_category:VideoContent-Portrait-This artist uses unique methods to paint his pottery action:play label:youtube {&el=youtube, &ec=VideoContent-Portrait-This artist uses unique methods to paint his pottery, &t=event, &ea=play, &cd6=online}
06-12 02:08:46.945 10194-10194/? E/ActivityThread: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver uds@5fa5135 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver uds@5fa5135 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:946)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:742)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1188)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1168)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1162)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:555)
at udq.<init>(SourceFile:21)
at udx.get(SourceFile:9)
at vkq.get(SourceFile:31)
at aces.get(SourceFile:10)
at hog.a(SourceFile:26)
at hpb.a(SourceFile:883)
at hnz.<init>(SourceFile:13)
at com.google.android.apps.youtube.embeddedplayer.service.service.jar.ApiPlayerService.<init>(SourceFile:60)
at com.google.android.apps.youtube.embeddedplayer.service.service.jar.ApiPlayerFactoryService$1.run(SourceFile:10)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-12 02:08:46.968 10194-10194/? E/ActivityThread: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver udp@a7bd896 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Service com.google.android.youtube.api.service.YouTubeService has leaked IntentReceiver udp@a7bd896 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:946)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:742)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1188)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1168)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1162)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:555)
at vki.<init>(SourceFile:53)
at vkq.get(SourceFile:32)
at aces.get(SourceFile:10)
at hog.a(SourceFile:26)
at hpb.a(SourceFile:883)
at hnz.<init>(SourceFile:13)
at com.google.android.apps.youtube.embeddedplayer.service.service.jar.ApiPlayerService.<init>(SourceFile:60)
at com.google.android.apps.youtube.embeddedplayer.service.service.jar.ApiPlayerFactoryService$1.run(SourceFile:10)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-12 02:08:47.015 8805-8805/I/ResourcesManager: isUpToDate /data/app/com.google.android.youtube-1/base.apk: true
What I am doing wrong? Before removing fragment I did set all resources to null and called release()
on the player instance but this log is still there.
回答1:
Well after trying multiple ways to use Youtube player fragment in project where we show list of videos in recycler view and each can be played in place (off course one at a time ).
Managing proper life cycle only ( calling release when removing fragment from one place to other ) will work only until you do it rapidly and if you happen to try to play 2 videos simultaneously the above issue will occur (ie internally youtube sdk will leak some touch event in message queue)
so instead of replacing youtube fragments for each video we create only one instance of fragment and reuse it at all places in app and if activity life cycle event (on pause/stop or on saved instance state is called) then we release the fragment and on resume we again create that single active instance of youtube fragment
this approach has practically fixed above issue as well https://issuetracker.google.com/issues/78370483
来源:https://stackoverflow.com/questions/44488780/service-com-google-android-youtube-api-service-youtubeservice-has-leaked-intentr