2013-02-13 75 views
0

我有一个应用程序,查询电话的数据库的消息。如果光标回到消息中,那么我试图一个接一个地在alertdialog中显示每条消息。我得到以下错误,说有一个窗口泄漏。与alertdialog窗口泄漏

我认为这是与alertdialog没有被正确取消之前显示下一个。有谁知道我为什么得到这个错误?

@Override 
    protected void onResume() { 
     super.onResume(); 
     Cursor c = nfcScannerApplication.loginValidate.queryAllFromMessage(); 

     Log.e(TAG, "messages in db = " + c.getCount()); 


      if(c != null && c.getCount() > 0){ 
       c.moveToFirst(); 

       while(c.moveToNext()){ 

       final String guid = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_GUID)); 
       final String message = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_TEXT)); 
       final String createdAt = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_CREATED_AT)); 
       final String sender = c.getString(c.getColumnIndex(LoginValidate.C_MESSAGE_SENDER)); 


       DateTime dt = new DateTime(createdAt); 
       DateTimeFormatter fmt2 = DateTimeFormat.forPattern("H:mm d-MMM-Y"); 
       String date = fmt2.print(dt); 

       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
         this); 

        // set title 
       alertDialogBuilder.setTitle("You have a new message : "); 

        // set dialog message 
        alertDialogBuilder 
         .setMessage( "\n" + message + "\n" 
           + "From : " + sender + " at " + date + "\n"+"Click OK to confirm message read") 
         .setCancelable(false) 
         .setPositiveButton("Ok",new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog,int id) { 


           nfcScannerApplication.loginValidate.deleteMessage(guid); 

           Cursor c = nfcScannerApplication.loginValidate.queryAllFromMessage(); 
           Log.e(TAG, "message count = " + c.getCount()); 

           //send guid back to martin so he can delete message on server 
           String[] params = new String[]{guid}; 
           AsyncCompleteMessage ascm = new AsyncCompleteMessage(); 
           ascm.execute(params); 

           finish(); 

          } 
          }); 

         // create alert dialog 
         AlertDialog alertDialog = alertDialogBuilder.create(); 

         // show it 
         alertDialog.show(); 

       }//end of while 
      }else{ 

       finish(); 
      } 

    } 

02-13 11:33:13.602: E/WindowManager(19605): Activity com.carefreegroup.DisplayMessageActivity has leaked window [email protected] that was originally added here 
02-13 11:33:13.602: E/WindowManager(19605): android.view.WindowLeaked: Activity com.carefreegroup.DisplayMessageActivity has leaked window [email protected] that was originally added here 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:465) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:419) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:351) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:171) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.Window$LocalWindowManager.addView(Window.java:558) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Dialog.show(Dialog.java:282) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.carefreegroup.DisplayMessageActivity.onResume(DisplayMessageActivity.java:103) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1266) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Activity.performResume(Activity.java:5148) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2997) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3055) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.access$600(ActivityThread.java:151) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.os.Looper.loop(Looper.java:155) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.main(ActivityThread.java:5485) 
02-13 11:33:13.602: E/WindowManager(19605):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 11:33:13.602: E/WindowManager(19605):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795) 
02-13 11:33:13.602: E/WindowManager(19605):  at dalvik.system.NativeStart.main(Native Method) 
02-13 11:33:13.602: E/WindowManager(19605): Activity com.carefreegroup.DisplayMessageActivity has leaked window [email protected] that was originally added here 
02-13 11:33:13.602: E/WindowManager(19605): android.view.WindowLeaked: Activity com.carefreegroup.DisplayMessageActivity has leaked window [email protected] that was originally added here 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:465) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:419) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:351) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:171) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.view.Window$LocalWindowManager.addView(Window.java:558) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Dialog.show(Dialog.java:282) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.carefreegroup.DisplayMessageActivity.onResume(DisplayMessageActivity.java:103) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1266) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.Activity.performResume(Activity.java:5148) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2997) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3055) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.access$600(ActivityThread.java:151) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.os.Looper.loop(Looper.java:155) 
02-13 11:33:13.602: E/WindowManager(19605):  at android.app.ActivityThread.main(ActivityThread.java:5485) 
02-13 11:33:13.602: E/WindowManager(19605):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-13 11:33:13.602: E/WindowManager(19605):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
02-13 11:33:13.602: E/WindowManager(19605):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795) 
02-13 11:33:13.602: E/WindowManager(19605):  at dalvik.system.NativeStart.main(Native Method) 

回答

5

尝试在onClick()方法调用finish()如下面的代码之前调用dialog.dismiss(); ..

public void onClick(DialogInterface dialog,int id) { 


          nfcScannerApplication.loginValidate.deleteMessage(guid); 

          Cursor c = nfcScannerApplication.loginValidate.queryAllFromMessage(); 
          Log.e(TAG, "message count = " + c.getCount()); 

          //send guid back to martin so he can delete message on server 
          String[] params = new String[]{guid}; 
          AsyncCompleteMessage ascm = new AsyncCompleteMessage(); 
          ascm.execute(params); 

          dialog.dismiss(); 
          finish(); 

         } 
+0

嗨,我没有参考onclick内的对话框。例如,我可以去this.dismissDialog(int),但我没有对话与整数编号 – turtleboy 2013-02-13 11:50:00

+0

检查我的代码..你可以使用对话界面来调用dismiss ..那我在做我的代码... – 2013-02-13 12:25:52

0

你试图显示一个对话框,你已经退出了这个Activity.Check后link.