decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager


使用Dialog的時候,沒少出現下面這兩個報錯

12-11 17:47:49.776: E/WindowManager(11461): android.view.WindowLeaked: Activity TestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42204800 V.E..... R.....I. 0,0-640,164} that was originally added here

 

12-11 17:47:50.666: E/AndroidRuntime(11461): java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{42204800 V.E..... R.....I. 0,0-640,164} not attached to window manager

其原因就是:Dialog生命周期比Activity的生命周期長

所以,出現這個bug的時候,請檢查創建這個Dialog的context所屬的Activity是不是已經結束了,而dialog還在顯示。

下面的測試代碼可以復現上面提到的bug

public class TestActivity extends Activity{
    private Dialog mDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mDialog = new Dialog(this);  
        mDialog.show();
        finish();//直接結束這個Activity,此時Dialog沒有關閉,還在顯示,生命周期比Activity長了,就會出現上面提到的Bug
}

解決方法:

1.請檢查,是否還未等Dialog消失就提前結束Activity。如果是,肯定是你的邏輯出問題了,還沒等Dialog結束就結束Activity。

2.不管什么情況,Activity一結束,確實要關閉Dialog。那么可在onStop或者onPause里面關閉dialog

@Override
protected void onStop() {
    super.onStop();
    if(mDialog.isShowing()){
        mDialog.dismiss();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM