2012-08-13 109 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; 
    } 
} 

希望這將使意義

相關問題