Android疑難bug統計

1.java.lang.UnsatisfiedLinkErrorjava

多半是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.ArrayIndexOutOfBoundsExceptionandroid

數組越界,普通的數組越界仍是比較容易發現的。下面場景的數組越界不容易被發現。
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?bash

參數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 nullapp

從表意上看是Activity跳轉的時候orderNo沒有傳,實際開發中這麼傻逼的行爲應該比較少。
我這邊的場景是 小米 MI 5S 微信支付回來會從新去intent中取orderNo,這時候的intent是微信支付發的,
裏面是沒有orderNo的。因此致使這個報錯。
複製代碼
建議:intent取字符串加是否有這個字段判斷(由於字符串字段是沒有默認值的), if(intent.hasExtra("orderNo")) intent.getStringExtra("orderNo") else ""

11.TransactionTooLargeExceptionide

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

12.不要用ScrollView嵌套RecyclerView、ListView。這樣會把item一次性加載到內存中。推薦使用NestedScrollView。

13.多線程操做數據庫須要使用事務。

14.頁面關閉關閉動畫。

15.回調看狀況須要判斷一下對象控件是否還存在。

16.網絡相關對象不要用lateinit

相關文章
相關標籤/搜索