Android 在带有媒体控件的媒体播放器应用程序中按“后退”按钮时出现窗口泄漏错误

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

我已经实现了媒体播放器控制器。问题在于,从用户控件对上一个活动可见的media player活动移动时,会发生窗口泄漏错误。此外,添加媒体控制器时,后退按钮也变为禁用。错误发生在bestAudioController.show()的第70行

这一行是playAudio()

erro日志显示以下内容

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