這篇博文主要是記錄下自己日常開發中遇到的一些坑,以及相應的解決解決方案,權當自己的筆記,如有兄弟遇到類似的問題,歡迎交流。
1 Activity之間跳轉的生命週期問題 :
背景 :有兩個Activity A和B,A跳轉到B,全局靜態屬性BitmapUtil.drr記錄了文件的路徑數據;A跳轉到B時,A在onDestroy裏清空drr數據,請問B在onCreate方法和onResume方法裏讀取到的drr數據是不是爲空?
測試結果:A跳轉到B, A在onDestroy裏清空了BitmapUtil.drr數據,導致在B的onCreate方法讀取drr數據不爲空,但onResume方法中讀取的drr數據爲空;
2. 視頻播放全屏底部白條問題 : 自己調整佈局 以及設置 正確的參數 :
surface_view.getHolder().setFixedSize(mSurfaceViewWidth, mSurfaceViewHeight);
3. 代碼設置TextView的字體大小 :記住默認是以SP爲單位的,所以不用再轉px了。
4. setOnScrollListener 滑動監聽: ListView第一次初始化就會調用onScroll方法,坑啊
//滾動監聽
pull_list_grid.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// Logger.e("firstVisibleItem::" + firstVisibleItem + " visibleItemCount :" +visibleItemCount +" totalItemCount :"+totalItemCount);
if (!TextUtils.isEmpty(keyword)&&!noMoreData && totalItemCount - firstVisibleItem < CommConfig.LetterLoadMore_SIZE && !httpIng) {
getMorePage();
}
}
});
5 postDelayed 方法中運行的Runable是主線程調了Runnable的run方法而已,細節忘了。。。。
postDelayed(new Runnable() {
@Override
public void run() {
}
},1000);
6. TextView要setMovementMethod(LinkMovementMethod.getInstance());//不設置 ClickableSpan沒有點擊事件
7. 設置 android:allowBackup=”false” 這個屬性存在bug,模式是true,在正式發佈app的時候設置爲false,但一般項目引用多個第三方庫的時候,會存在坑多個衝突,導致打包APP失敗,查看日誌也找到了google給出的建議,如下:
Suggestion: add 'tools:replace="android:allowBackup"' to <application> element at AndroidManifest.xml:89:5-1052:19 to override.
所以添加 :
tools:replace="android:allowBackup"
8.使用優測,發現一些安全漏洞和一些bug 但TM按照給出的修改建議,修改bug後,再測試還是有相同的漏洞,表示很坑啊。。。。
9.TextView 同時顯示錶情和文字, 可能存在表情被遮擋部分或者文字表情不居中顯示bug, 操蛋,這個調試了好久,嘗試過設置表情大小,文字大小,發現都不能根本解決問題,調試好久, 最終發現設置TextView的高度爲wrap_content是不行的,要設置爲相應的高度值 ,比如20dp 就OK了
10.自定義屬性和support:appcompat-v7:22.2.0包屬性衝突 : 根本的解決方法都是更改自定義控件的屬性,但因爲我的項目中大量使用了這個控件,因爲項目緊張, 所以找了一個暫時的解決方法
<attr name="title" format="string" />
<attr name="titleTextSize" format="dimension" />
<attr name="titleTextColor" format="color" />
<attr name="title" />
<attr name="titleTextSize"/>
<attr name="titleTextColor"/>
最後,我抽空寫了一個java程序,修改了所有使用這個控件的屬性方法,從源頭解決方法
11. APP啓動顯示默認的啓動頁面(跟微信類似) : 關鍵代碼 android:theme=”@style/AppSplash”
<!--啓動頁面-->
<activity
android:name=".activity.login.SplashActivity_"
android:theme="@style/AppSplash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--啓動頁面主題 可以自己定製 -->
<style name="AppSplash" parent="android:Theme">
<item name="android:windowBackground">@drawable/splash_bg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
12. Android 開發的時候在Application開啓 嚴格模式,會查找到很多問題代碼:
/**
* 嚴格模式開啓一
*/
private void setStrictMode() {
if (LogUtil.isDebug && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) {
StrictMode.enableDefaults();
}
}
/**
* 嚴格模式二
*/
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //檢查SQLiteCursor泄漏
.detectLeakedClosableObjects() //檢查所有繼承java.io.Closeable泄漏:如流沒有關閉
.detectActivityLeaks() //檢查Activity泄漏
.penaltyLog() //檢測到問題時,將日誌輸出到Logcat
// .penaltyDeath() //檢測到問題時,直接崩潰
.build());
13. butterknife 插件使用: 鼠標點到R.layout.activity_main佈局 ,再右鍵Generate–》ButterKnife 選項
14. MuritaleDex :這個是65536的問題,APP項目功能越來越多,引用越來越多第三方的Jar包的時候,就有很大的概率觸發這個問題。Android5.0以上的系統,不需要擔心這個問題。
compile 'com.android.support:multidex:1.0.1'//引用multidex庫
15. leak canary 內存泄漏檢測工具 :下面這段代碼這能放在項目APP的build文件中,而不能放在任何第三放的aar的build文件中。
//leak canary 內存泄漏檢測工具
//https://github.com/square/leakcanary
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
LeakCanary工作原理
•RefWatcher.watch()創建一個KeyedWeakReference到監控的對象。
•接下來,在後臺線程中檢測這個引用是否被清除,如果沒有將會觸發GC。
•如果引用仍然沒有清除,將heap內存dump到一個.hprof的文件存放到手機系統裏。
•HeapAnalyzerService在另外一個獨立的進程中啓動,使用HeapAnalyzer解析heap內存通過HAHA這個項目
•HeapAnalyzer計算出到GC ROOTs的最短強引用路徑決定是否發生Leak,然後建立導致泄漏的引用鏈。 結果被回傳到應用程序進程的DisplayLeakService中,然後顯示一個泄漏的通知。
16 . Android高級開發之性能優化典範 值得一看 ,開發規範很重要
17 . LinearLayout中設置android:orientation=”horizontal” ,它的高度以第一個view的高度爲準,導致高度不對,解決方法: 在第一個View的外層添加一個LinearLayout ,設置高度爲 android:layout_height=”match_parent”
18.multidex引發的後遺症, 當修改MAinActivity的FindFragment爲InfoFragment時,分包Dex包中不存在InfoFragment類,其實是因爲手機上的dex是舊的dex包,導致沒有更新所致,解決方法是刪除掉手機上的APP,然後Clean一下AS工具,重新安裝App即可