Android 在带有媒体控件的媒体播放器应用程序中按“后退”按钮时出现窗口泄漏错误
我已经实现了媒体播放器控制器。问题在于,从用户控件对上一个活动可见的media player活动移动时,会发生窗口泄漏错误。此外,添加媒体控制器时,后退按钮也变为禁用。错误发生在bestAudioController.show()的第70行 这一行是playAudio() erro日志显示以下内容Android 在带有媒体控件的媒体播放器应用程序中按“后退”按钮时出现窗口泄漏错误,android,mediacontroller,Android,Mediacontroller,我已经实现了媒体播放器控制器。问题在于,从用户控件对上一个活动可见的media player活动移动时,会发生窗口泄漏错误。此外,添加媒体控制器时,后退按钮也变为禁用。错误发生在bestAudioController.show()的第70行 这一行是playAudio() erro日志显示以下内容 Activity com.example.hawk.hojaa.PlayerActivity has leaked window com.android.internal.policy.i
Activity com.example.hawk.hojaa.PlayerActivity has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView{52a3f974 V.E.....
R.....ID 0,0-768,176} that was originally added here
android.view.WindowLeaked: Activity com.example.hawk.hojaa.PlayerActivity
has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView{52a3f974 V.E.....
R.....ID 0,0-768,176} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
at
android.view.WindowManagerGlobal.
addView(WindowManagerGlobal.java:239)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
at android.widget.MediaController.show(MediaController.java:346)
at android.widget.MediaController.show(MediaController.java:306)
at com.example.hawk.aise.PlayerActivity.
playAudio(PlayerActivity.java:84)
at com.example.hawk.aise.
PlayerActivity$1.onServiceConnected(PlayerActivity.java:70)
at android.app.
LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1106)
at android.app.
LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1123)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.
run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Activity com.example.hawk.hojaa.PlayerActivity已泄漏窗口
com.android.internal.policy.impl.PhoneWindow$DecorView{52a3f974 V.E。。。。。
R.…ID 0,0-768176}最初添加到此处
android.view.windowsleek:Activity com.example.hawk.hojaa.PlayerActivity
窗户漏水了
com.android.internal.policy.impl.PhoneWindow$DecorView{52a3f974 V.E。。。。。
R.…ID 0,0-768176}最初添加到此处
在android.view.ViewRootImpl。(ViewRootImpl.java:345)
在
android.view.WindowManagerGlobal。
addView(WindowManagerGlobal.java:239)
在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
位于android.widget.MediaController.show(MediaController.java:346)
位于android.widget.MediaController.show(MediaController.java:306)
请访问com.example.hawk.aise.PlayerActivity。
playAudio(PlayerActivity.java:84)
在com.example.hawk.aise。
PlayerActivity$1.onServiceConnected(PlayerActivity.java:70)
在android.app上。
LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1106)
在android.app上。
LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1123)
位于android.os.Handler.handleCallback(Handler.java:730)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5103)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller上。
run(ZygoteInit.java:737)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)
解决方案是在退出活动之前在您创建的对话框上调用hide()
,例如在onPause()
或onDestory()
中。离开活动前,应关闭所有窗口和对话框
切换到其他活动时,必须关闭bestAudioController
对话框
...
progressDialog.dismiss();
progressDialog.hide();
...
在退出活动之前,在您在中创建的bestAudioController上调用hide()
,例如在onPause()
或onDestroy()
finish()
方法将关闭活动,但bestAudioController
仍在显示
编辑:
如果对话框为AlertDialog
,则应调用dismise()
。如果是MediaController
对话框,则必须调用hide()
我希望有帮助 我用来解决这个问题的解决方案是在
hide()
之前调用对话框上的dismise()
,以确保在转到其他活动之前完全删除该对话框
...
progressDialog.dismiss();
progressDialog.hide();
...
谢谢你的回复。我怎样才能调用bestAudioController上的Disclose方法。bestAudioController对象来自从MediaControl扩展的类公共类bestAudioController扩展MediaController{public bestAudioController(上下文c){super(c);}@Override public void hide(){}}您是否尝试调用:bestAudioController.dismise()@我已经更新了我的答案。请在添加bestAudioController.Disclose()时使用更新的代码Yes重试;解除将变为错误。请尝试隐藏()而不是解除()
@Override
protected void onPause() {
if (bestAudioController != null && bestAudioController.isShowing()) {
bestAudioController.hide();
}
super.onPause();
}
@Override
protected void onDestroy() {
if (bestAudioController != null && bestAudioController.isShowing()) {
bestAudioController.hide();
}
super.onDestroy();
}
...
progressDialog.dismiss();
progressDialog.hide();
...