Android疑難bug統計

劉小帥發表於2019-02-01

1.java.lang.UnsatisfiedLinkError

多半是so載入姿勢不對。so沒載入進來或者so初始化失敗。把三方庫的初始化放回application試試
複製程式碼
建議:使用的minSdkVersion對應的NDK版本來編譯so。因為NDK是向上相容的
提示:21以上用Build.SUPPORTED_ABIS[0],21一下用Build.CPU_ABI獲取裝置CPU ABI。其中Build.CPU_ABI能表示系統為這個應用選擇的ABI。

2.java.lang.ArrayIndexOutOfBoundsException

陣列越界,普通的陣列越界還是比較容易發現的。下面場景的陣列越界不容易被發現。
1.下拉重新整理資料還沒有返回時,迅速向上滑。
主要還是寫法錯誤,在資料還沒有返回時就刪除了資料來源,導致向上滑動時資料來源已經沒有了。

2.下拉重新整理資料還沒有返回時點選item。
錯誤的寫法和上面是一樣的

3.需要使用網路返回的資料position,而網路請求資料沒有返回
複製程式碼
建議:重新整理資料清空放到網路資料請求的回撥中。page為1清空資料;page不為1不清空。

3.java.lang.NullPointerException

空指標異常,普通的空指標異常也是比較容易發現的。下面的場景比較難發現。
網路請求沒有返回導致資料實體為空,而在點選或者其他操作中又使用了該實體。
複製程式碼
建議:在所有使用網路返回的資料實體的地方加上判空處理。

4.Unable to add window -- token android.os.BinderProxy@1fb9679 is not valid; is your activity running?

dialog所依附的view已經不存在
複製程式碼
建議:在dialog.show之前判斷activity.isFinishing()。
5.android.view.WindowLeaked: Activity com.mistong.ewt360.ui.activity.MainActivity has leaked window
當面頁面關閉了,但是依附在當前頁面的dialog卻沒有被關閉,造成記憶體洩漏。
複製程式碼
建議:在onDestory加入if (mDialog!=null && mDialog.isShowing()) { mDialog.dismiss(); }
提示:多用DailogFragment,便於生命週期的管理。

6.Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord @xxx is not valid; is your activity running?

引數context 指定成了this,即指向當前子Activity的context。
但子Activity是動態建立的,不能保證一直存在。
複製程式碼
建議:將context替換為getParent。

7.Fragment already added: KnowledgeTreeDialogFragment

Fragment重複新增,小心DialogFragment也屬於fragment,在show時會呼叫add方法
複製程式碼
建議:Fragment加FragmentManager.findFragmentByTag和isAdded判斷DialogFragment重寫show方法。
 override fun show(manager: FragmentManager?, tag: String?) {
        try {
            if (manager == null || manager.isDestroyed) {
                return
            }
            manager.beginTransaction().remove(this).commit()
            super.show(manager, tag)
        } catch (e: Exception) {
            //防止onSaveInstanceState之後執行add fragment
            e.printStackTrace()
        }
    }
複製程式碼

8.Can not perform this action after onSaveInstanceState

Fragment在onSaveInstanceState做操作就會報這個錯誤,
把commit換成commitAllowingStateLoss可解決這個問題,會忽略mStateSaved。
複製程式碼
建議:用commitAllowingStateLoss需要檢查功能正確性,commit操作儘量放在onCreate方法中

9.handler建議用靜態類和弱引用的方式使用,防止記憶體洩漏

10.java.lang.IllegalStateException intent.getStringExtra("orderNo") must not be null

從表意上看是Activity跳轉的時候orderNo沒有傳,實際開發中這麼傻逼的行為應該比較少。
我這邊的場景是 小米 MI 5S 微信支付回來會重新去intent中取orderNo,這時候的intent是微信支付發的,
裡面是沒有orderNo的。所以導致這個報錯。
複製程式碼
建議:intent取字串加是否有這個欄位判斷(因為字串欄位是沒有預設值的), if(intent.hasExtra("orderNo")) intent.getStringExtra("orderNo") else ""

11.TransactionTooLargeException

Intent傳引數據量偏大,bundle緩衝區最大1M
複製程式碼
建議:用Eventbus等其他方式代替

12.不要用ScrollView巢狀RecyclerView、ListView。這樣會把item一次性載入到記憶體中。推薦使用NestedScrollView。

13.多執行緒運算元據庫需要使用事務。

14.頁面關閉關閉動畫。

15.回撥看情況需要判斷一下物件控制元件是否還存在。

16.網路相關物件不要用lateinit

相關文章