1. 程式人生 > >開發中遇到的bug及解決方案(一)

開發中遇到的bug及解決方案(一)

該異常表示不能新增視窗,通常是所要依附的view已經不存在導致的。[解決方案]:Dialog&AlertDialog,WindowManager不能正確使用時,經常會報出該異常,原因比較多,幾個常見的場景如下:1.上一個頁面沒有destroy的時候,之前的Activity已經接收到了廣播。如果此時之前的Activity進行UI層面的操作處理,就會造成crash。UI層面的重新整理,一定要注意時機,建議使用set_result來代替廣播的形式進行重新整理操作,避免使用廣播的方式,程式碼不直觀且容易出錯。2.Dialog在Actitivty退出後彈出。在Dialog呼叫show方法進行顯示時,必須要有一個Activity作為視窗的載體,如果Activity被銷燬,那麼導致Dialog的視窗載體找不到。建議在Dialog呼叫show方法之前先判斷Activity是否已經被銷燬。3.Service&Application彈出對話方塊或WindowManager新增view時,沒有設定window type為TYPE_SYSTEM_ALERT。需要在呼叫dialog.show()方法前新增dialog.getWindow().SetType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)。4.6.0的系統上, (非定製 rom 行為)若沒有給予懸浮窗許可權, 會彈出該問題, 可以通過Settings.canDrawOverlays來判斷是否有該許可權.5.某些不穩定的MIUI系統bug引起的許可權問題,系統把Toast也當成了系統級彈窗,android6.0的系統Dialog彈窗需要使用者手動授權,若果app沒有加入SYSTEM_ALERT_WINDOW許可權就會報這個錯。需要加入給app加系統Dialog彈窗許可權,並動態申請許可權,不滿足第一條會出現沒許可權閃退,不滿足第二條會出現沒有Toast的情況。
//解決辦法 判斷Activity是否被銷燬
  一般會遇到這樣的情況:在一個Activity中啟動一個非同步任務,非同步任務中需要返回值,然後被Activity使用,但是當非同步任務還未結束時,按下home鍵,如果這個時候系統記憶體比較緊張,這個Activity有可能被銷燬(如果使用小米手機進行真機除錯,可以在開發者選項中開啟不保留活動選項),這個時候非同步任務返回後會報異常,那如何解決這種問題,最簡單的辦法是在非同步任務返回後做一下判斷,若Activity已經被銷燬了,則直接返回,不做任何處理。  一般我們會使用activity.isFinishing()方法,若Activity被結束,這返回true,否則的話返回false。在實際的專案中發現這樣還不行,還需要使用activity.isDestoryed()方法來判斷activity是否被銷燬,但是有個問題是isDestoryed()方法支援的最低版本為Level 17,那對於17版本以下的如何去處理呢?
  可以使用FragmentManager物件來判斷,即        if(fragmentManager.isDestroyed) return;API doc 下這樣寫道:/*** Returns true if the final {@link Android.app.Activity#onDestroy() Activity.onDestroy()}* call has been made on the FragmentManager's Activity, so this instance is now dead.*/public abstract boolean isDestroyed();
意思很明顯,如果Activity被銷燬的話,那麼fragmentManager 的例項也死亡了。