老司機帶路——15個Android擼代碼常見的坑


 

老司機為何能夠成為老司機,不是因為開車開得多,而是擼多了…

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. 不能調用 PopupWindowshow 方法顯示,也應在 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 中使用 FragmentActivity 中有一個控件 ID 為 R.id.widget_btn ,但是在 Fragment 里面也有一個控件 ID 為 R.id.widget_btn ,那么在 Fragment 里面使用 getActivity().findViewById() 時就無法取到正確的控件引用。

0x09 WebView 無法彈起 H5 中的 alert 和 comfirm 對話框的問題

WebView 是一個承載體,各種內容的渲染需要使用 WebViewChromClient 去實現,所以需要設置一個默認的 WebChromeClient 實現。但是一般情況下實現自定義 WebView 都會重寫 onAlertonConfirm 方法,使用 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>
不要 ListFragmentonCreateView() 中設置 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() 盡量少做影響列表性能的操作。

 

微信關注我們,可以獲取更多

 


免責聲明!

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



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