老司機為何能夠成為老司機,不是因為開車開得多,而是擼多了…
0x00 使用 startActivityForResult 后在 onActivityResult 中沒有正確回調到 Activity.RESULT_OK
1. 要正確獲取到 RESULT_OK
的狀態碼,Activity
的啟動模式不能為設置為的 singleTask
或者 singleInstance
2. 調用 startActivityForResult(intent,requestCode)
方法時第二個參數不應該使用過大的整數,例如超過 65535
0x01 Activity 的 onCreate() 方法中操作 View 相關
1. 不能直接獲取 View
的寬高,而應在 view.post()
里面操作
2. 不能調用 PopupWindow
的 show
方法顯示,也應在 view.post()
里面操作
0x02 TransactionTooLargeException 異常
這個錯誤主要發生在Intent
中傳遞了大量的數據。
例如有一個
Activity
頁面跳轉中,經常會使用
Intent
傳遞數據,但是稍不留神就會把一個很大的對象(列表,
bitmap
等)傳遞過去,這時候就會出現這個異常。
建議不要在
Intent
中傳遞大數據,應該使用持久化的方式共享數據。而且數據過多也會影響
Activity
的啟動速度。
類似問題
startActivity()
時發生以下錯誤
java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy。This log means that your app is having trouble handling a communication intent. Sometimes problems like this can be cause by sending an intent with big extras. Try to reduce the dimension of the image or, and this is the best way, save your image on the sd and put in the extras only the Uri of that image。
即不要在Intent
中傳遞大量的數據數據,否則會拋異常。
0x03 FragmentTransaction.setCustomAnimations() 后動畫沒有效果
setCustomAnimations
要在 replace()
,add()
或 remove()
等對 Fragment
添加或者移除的方法前面。
0x04 應用使用多進程應該注意的問題
1. Application
會被初始化多次,即 onCreate()
方法會執行多次。在這里的一些初始化邏輯,例如數據庫初始化,就需要根據判斷當前進程的名稱來進行初始化。
2. 主進程與子進程數據共享的問題。由於不存在同一個內存空間,數據共享可以考慮使用 ContentProvider
。
0x05 應用打包后 H5 無法訪問到 WebView 與 JS 交互的自定義 JSBridge 類
WebView
通過
addJavascriptInterface()
注入本地實現的方法類
JsBridge
供 H5 訪問,但是打包時應該把自定義的
JSBridge
類加入到混淆規則里面,否則混淆后 H5 將有可能無法訪問本地方法。
0x06 App 端使用 WebView.loadUrl() 執行 JS 方法后無響應
1. WebView
通過 loadUrl()
執行 JS 方法后卻無響應,但是前端確定已提供。這時候應該考慮使用主線程(例如 WebView.post()
)來執行 loadUrl()
;
2. 通過 H5 調用本地方法時,如果 H5 是異步調用,那么也應該考慮把本地方法的實現放在主線程中。
0x07 UI 控件的樣式出現了很奇詭的渲染,例如花屏、閃動等的問題
1. 有些機型使用硬件加速出現了一些奇詭的UI問題,可以檢查一下控件所在Activity
是否配置了硬件加速,多數情況下去掉硬件加速就 OK 了。
2. 如果需要硬件加速的配置,可以考慮在控件本身上使用,而不是
Activity
上。
0x08 Activity 與 Fragment 控件 ID 重復的問題
Activity
中使用
Fragment
,
Activity
中有一個控件 ID 為
R.id.widget_btn
,但是在
Fragment
里面也有一個控件 ID 為
R.id.widget_btn
,那么在
Fragment
里面使用
getActivity().findViewById()
時就無法取到正確的控件引用。
0x09 WebView 無法彈起 H5 中的 alert 和 comfirm 對話框的問題
WebView
是一個承載體,各種內容的渲染需要使用
WebViewChromClient
去實現,所以需要設置一個默認的
WebChromeClient
實現。但是一般情況下實現自定義
WebView
都會重寫
onAlert
和
onConfirm
方法,使用
AlertDialog
來展示
H5
中的
alert
或者
confirm
對話框。
0x10 GridView 中的 Item 無法居中問題
查看一下GridView
的布局文件是否設置了
android:scrollbarStyle="outsideInset"
屬性,如果有,去掉這個屬性。
0x11 EditText textCursorDrawable 屬性直接用 color 在很多手機上光標是不會閃動
需要用drawable
來設置這個屬性,寫一個
drawable
文件,例如
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@color/white" />
<size android:width="1dp" />
</shape>
0x12 在 ListFragment 中 set footer 后 java.lang.IllegalStateException問題
不要ListFragment
的
onCreateView()
中設置
footer
,要在
onActivityCreate()
中設置,否則會
Caused by: java.lang.IllegalStateException: Content view not yet created
。
0x13 開源項目 TabPageIndicator Tab 默認情況只顯示 6 個中文字符,過多的字符被截斷了
可修改TabView
中的
mMaxTabWidth
的值,默認時
mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f);
修改為
mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 1f);
0x14 SpannableStringBuilder 修飾文本影響 ListView 性能問題
通常需要在一個列表中對Item
的文本作一些特殊的修飾處理,例如對文本添加簡單的圖標,文本顏色,字體高亮等等效果,這時候
SpannableStringBuilder
就可以幫上忙了。但如果在
getView()
方法里構造
Spannable
對象,明顯會影響列表的展示的效率,應該在線程中先這些
Spannable
數據構造好,而
getView()
盡量少做影響列表性能的操作。
微信關注我們,可以獲取更多