開發APP中遇到的坑

這篇博文主要是記錄下自己日常開發中遇到的一些坑,以及相應的解決解決方案,權當自己的筆記,如有兄弟遇到類似的問題,歡迎交流。

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即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章