2012-08-13 91 views
-1

在onPostExecute我试图显示处理程序,但它给予异常活动已泄漏窗口。错误点在代码中突出显示如下。这个问题的解决方案是什么?Alertdialog解散之前活动关闭,并给出活动泄露窗口例外

class Communicator extends AsyncTask<String, String, String> 
      { 
       int prog = 0; 

       @Override 
       protected String doInBackground(String... params) { 
        String response = null; 
        try { 
         if(Login.uname != null && Login.pass != null){ 
         sync(Login.uname, Login.pass); 
         }else if(SplashScreen.user != null && SplashScreen.pas != null){ 
          sync(SplashScreen.user, SplashScreen.pas); 
         } 
         if("ok".equalsIgnoreCase(status)) 
         { 
          if(memoryInfo(true)){ 
           AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
           alert.setTitle(R.string.set4Play); 
           alert.setMessage(getString(R.string.lowMemorySync)); 
           alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
           alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 

            } 
           }); 
           alert.setCanceledOnTouchOutside(false); 
           alert.show(); 
          }else{ 
          new Thread() 
          { 
           @Override 
           public void run() 
           { 
            try{ 
            Data.filenames = new ArrayList<String>(); 
            for(int i = 0; i< list.size();i++) 
            { 
             if(mname.size() > i) 
              mnam = mname.get(i); 
             if(Login.uname != null && Login.pass != null){ 
              mp3Download(Login.uname, Login.pass, list.get(i), mnam); 
             } 
             if(SettingActivity.userna != null && SettingActivity.passwo != null){ 
              mp3Download(SettingActivity.userna, SettingActivity.passwo, list.get(i), mnam); 
             } 
             publishProgress("" + ((bytecopied1*100)/(totalsize))); 
             c++; 
             long b = bytecopied1*100; 
             float a = b/totalsize; 
             Message msg = my_handler.obtainMessage(); 
             msg.arg1 = (int)a; 
             my_handler.sendMessage(msg); 
             if(list.size() == c){ 
              isTrue = true; 
             } 
            } 
            }catch (Exception e) { 

            } 
            super.run(); 
           } 
          }.start(); 
          } 
          count ++; 
         } 
         else if("tomany".equalsIgnoreCase(status)) 
         { 
          AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
          alert.setTitle(R.string.set4Play); 
          alert.setMessage(getString(R.string.tomany)); 
          alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
          alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 

           } 
          }); 
          alert.setCanceledOnTouchOutside(false); 
          alert.show(); 
         } 
         else if("fail".equalsIgnoreCase(status)) 
         { 
          AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
          alert.setTitle(R.string.set4Play); 
          alert.setMessage(getString(R.string.connectionerror)); 
          alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
          alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            Intent backintent = new Intent(NeliteMusicActivity.this, HomeScreen.class); 
            startActivity(backintent); 
            return; 
           } 
          }); 
          alert.setCanceledOnTouchOutside(false); 
          alert.show(); 
         } 
         totalsize = 0; 
         for(int i=0; i<list.size(); i++) 
         { 
          totalsize += Integer.parseInt(cont.get(i).getSize()); 
         } 

        } catch (Exception e) { 
         Log.e("Data.LOG", e.getMessage(), e); 

        } finally { 
        } 
        return response; 
       } 

       @Override 
       protected void onPreExecute() { 
        prog = 0; 
        super.onPreExecute(); 
       } 

       @Override 
       protected void onPostExecute(String result) { 
        super.onPostExecute(result); 

        if ("ok".equalsIgnoreCase(status)) 
        { 
         sizekb=0; 
         new Set4Play13(getBaseContext()); 
         sizeall = new Integer[cont.size()]; 
         for (int i = 0; i < cont.size(); i++) { 
          mixname = cont.get(i).getMixname(); 
          mixnumber = cont.get(i).getNumber(); 
          int size = Integer.parseInt(cont.get(i).getSize()); 

          sizekb= sizekb+size; 
          sizeall[i] = size; 

          db.addContact(new Dataset(cont.get(i).getNumber(), cont 
            .get(i).getUsername(), cont.get(i).getMixname(), 
            cont.get(i).getSize(), cont.get(i).getUpdate(), 
            cont.get(i).getKg())); 
          Log.e("cont.get(i).getKg()", "cont.get(i).getKg()"+cont.get(i).getKg()); 
         } 
        } 
       } 

       private Handler my_handler = new Handler() 
       { 

        public void handleMessage(Message msg) 
        { 
         int a=msg.arg1; 
         progress.setProgress(a); 
         textsync.setText("Syncing mix "+c); 
         if(progress.getMax()<=a) 
         { 
          if (isOnline()) 
           { 
            AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
            alert.setTitle(R.string.set4Play); 
            alert.setMessage(getString(R.string.updatedMix)); 
            alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
            alert.setButton(getString(R.string.ok), 
              new DialogInterface.OnClickListener() 
            { 
              public void onClick(DialogInterface dialog, int which) { 
               dialog.dismiss(); 
               animatedStartActivity(); 
             } 
             }); 
            alert.setCanceledOnTouchOutside(false); 
            alert.show();(Here is the Error) 
           } 
          if (!isOnline()) { 
           AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
           alert.setTitle(R.string.set4Play); 
           alert.setMessage(getString(R.string.connectionerror)); 
           alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
           alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
             public void onClick(DialogInterface dialog, int which) { 
              Intent intent = new Intent(getApplicationContext(),HomeScreen.class); 
          intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
          startActivity(intent); 
          finish(); 
            } 
            }); 
           alert.setCanceledOnTouchOutside(false); 
           alert.show(); 
          } 
         } 
         super.handleMessage(msg); 
        } 
       }; 
      } 

的logcat:

10-13 18:53:20.220: E/WindowManager(4530): Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here 
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.ViewRoot.<init>(ViewRoot.java:291) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:249) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.Window$LocalWindowManager.addView(Window.java:532) 
10-13 18:53:20.220: E/WindowManager(4530): at android.app.Dialog.show(Dialog.java:269) 
10-13 18:53:20.220: E/WindowManager(4530): at com.nelitemusic.NeliteMusicActivity$Communicator$1.handleMessage(NeliteMusicActivity.java:372) 
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Looper.loop(Looper.java:132) 
10-13 18:53:20.220: E/WindowManager(4530): at android.app.ActivityThread.main(ActivityThread.java:4126) 
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invokeNative(Native Method) 
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invoke(Method.java:491) 
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
10-13 18:53:20.220: E/WindowManager(4530): at dalvik.system.NativeStart.main(Native Method) 
10-13 18:53:20.220: E/WindowManager(4530): Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here 
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window [email protected] that was originally added here 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.ViewRoot.<init>(ViewRoot.java:291) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:249) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 
10-13 18:53:20.220: E/WindowManager(4530): at android.view.Window$LocalWindowManager.addView(Window.java:532) 
10-13 18:53:20.220: E/WindowManager(4530): at android.app.Dialog.show(Dialog.java:269) 
10-13 18:53:20.220: E/WindowManager(4530): at com.nelitemusic.NeliteMusicActivity$Communicator$1.handleMessage(NeliteMusicActivity.java:372) 
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-13 18:53:20.220: E/WindowManager(4530): at android.os.Looper.loop(Looper.java:132) 
10-13 18:53:20.220: E/WindowManager(4530): at android.app.ActivityThread.main(ActivityThread.java:4126) 
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invokeNative(Native Method) 
10-13 18:53:20.220: E/WindowManager(4530): at java.lang.reflect.Method.invoke(Method.java:491) 
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
10-13 18:53:20.220: E/WindowManager(4530): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
10-13 18:53:20.220: E/WindowManager(4530): at dalvik.system.NativeStart.main(Native Method) 
10-13 18:53:20.720: E/<<path>>(4530): >>path<<file://mnt/sdcard/NeliteMusic/sponsormix.mp3 
10-13 18:53:20.720: E/<<Login Start>>(4530): >>Login Start<< 
10-13 18:53:21.100: E/<<path>>(4530): >>path<<file://mnt/sdcard/NeliteMusic/sponsormix.mp3 
10-13 18:53:21.100: E/<<SettingActivity Start>>(4530): >>SettingActivity Start<< 
+0

的AsyncTask doInBackground( Params ...)涉及非UI线程来执行任务,因此调用UI执行将产生异常。在你的情况下,你需要去http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress ...) – 2012-08-13 14:00:28

+0

10-13 18:53:20.220:E/WindowManager(4530 ):at com.nelitemusic.NeliteMusicActivity $ Communicator $ 1.handleMessage(NeliteMusicActivity.java:372)< - 你能指出这一行吗? – Ostkontentitan 2012-08-13 14:03:46

+0

你在doinbackground中做了太多的ui操作,你不应该从这个线程显示提示对话框 – nandeesh 2012-08-13 14:04:29

回答

1

当您在活动有效完成后尝试显示警报时,会发生“活动泄漏了最初添加的窗口...”错误。见Activity has leaked window that was originally added

你有AFAIK两种选择:

  1. 重新考虑你的警戒登录:实际上退出您的活动之前调用解雇()在对话框上。
  2. 将对话框放入其他线程并在该线程上运行(与当前活动无关)。
+0

我已经尝试了第一点,但它不工作,而它给出了同样的错误。请你详细说明第二点? – bkshukla 2012-08-13 14:27:07

+0

对于第二个建议,您可以尝试使用Runnable在新线程上显示警报。 runOnUiThread(new Runnable(){ public void run(){MyDialog.Prompt(NameOfYourActivity.this);} }); – 2012-08-13 14:32:46

0

尝试使用DialogFragment,而不仅仅是一个对话框。他们更好地处理生命周期。

0

好吧,让我给一些基本思想,以显示对话框同时更新,

class Communicator extends AsyncTask<String, Integer, String> 
{ 
    int prog = 0; 

    @Override 
    protected String doInBackground(String... params) { 
     String response = null; 
     try { 
      if(Login.uname != null && Login.pass != null){ 
      sync(Login.uname, Login.pass); 
      }else if(SplashScreen.user != null && SplashScreen.pas != null){ 
       sync(SplashScreen.user, SplashScreen.pas); 
      } 
      if("ok".equalsIgnoreCase(status)) 
      { 
       if(memoryInfo(true)){ 
        publishProgress(LOW_MEMORY); 
        return (null); 
       }else{..... 

用于显示对话框

protected void onProgressUpdate(Integer... statusCode) { 
    switch (statusCode[0]) { 
    case LOW_MEMORY: 
     AlertDialog alert =new AlertDialog.Builder(NeliteMusicActivity.this).create(); 
     alert.setTitle(R.string.set4Play); 
     alert.setMessage(getString(R.string.lowMemorySync)); 
     alert.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
     alert.setButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       alert.dismiss(); 
      } 
     }); 
     alert.setCanceledOnTouchOutside(false); 
     alert.show(); 
     break; 
    } 
} 

希望这将使意义

相关问题