在Alertdialog解散之前,活动已关闭,并提供活动泄露窗口例外

时间:2012-08-13 13:32:21

标签: android

在onPostExecute中我试图显示处理程序,但它给出了异常Activity已泄露的窗口。错误点在代码下方突出显示。这个问题的解决方案是什么。

 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 com.android.internal.policy.impl.PhoneWindow$DecorView@40c2d8f8 that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40c2d8f8 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 com.android.internal.policy.impl.PhoneWindow$DecorView@40b35838 that was originally added here
10-13 18:53:20.220: E/WindowManager(4530): android.view.WindowLeaked: Activity com.nelitemusic.NeliteMusicActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40b35838 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<<

3 个答案:

答案 0 :(得分:1)

当活动有效完成后尝试显示警报时,“活动已泄露最初添加的窗口...”会出现错误。请参阅Activity has leaked window that was originally added

您有两种选择AFAIK:

  1. 重新考虑警报的登录:在实际退出活动之前,在对话框上调用dismiss()。
  2. 将对话框放在另一个线程中并在该线程上运行(与当前活动无关)。

答案 1 :(得分:0)

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

答案 2 :(得分: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;
    }
}

希望这会有意义