這篇博客持續更新自己總結的一些在項目開發中碰到的坑或者技巧,上篇是技巧篇,下篇是踩坑篇。藉此以起到警示自己和幫助大家的作用!
一、技巧篇
1、懶漢式單例的雙重校驗鎖寫法,用到Java中的關鍵字Volatile
public class VolatileSingleton {
public static volatile VolatileSingleton mSingleton;
private VolatileSingleton() {
}
public static VolatileSingleton getInstance() {
if (null == mSingleton) {
synchronized (VolatileSingleton.class) {
if (null == mSingleton) {
mSingleton = new VolatileSingleton();
}
}
}
return mSingleton;
}
}
2、懶漢式單例的靜態內部類寫法
public class InnerClsSingleton {
private InnerClsSingleton() {
}
private static class SingletonLoader {
private static final InnerClsSingleton SINGLETON = new InnerClsSingleton();
}
public static InnerClsSingleton getInstance() {
return SingletonLoader.SINGLETON;
}
}
3、一行居中,多行局左的TextView,在TextView外層嵌套寬高爲wrap_content,居中的VeiwGroup
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="一行一行一行一行兩行兩行"
android:textSize="50sp" />
</RelativeLayout>
4、讓低版本系統的手機展示的AlertDialog也有好的風格,可以用android.support.v7.app.AlertDialog包下的AlertDialog
5、activity中,如果onActivityResult方法有執行,則其會在onResume方法之前執行。
6、try catch finally語句中,try中執行了return,finally中的代碼依然會執行。
7、使用Handler定時滾動ViewPager時,當界面不可見時Handler還是會run,應該在不可見時停掉Handler
8、看圖
實現類似如圖中紅框內圖標超出佈局高度的效果時,簡單來寫可以在佈局文件的根佈局使用android:clipChildren=”false”屬性,然後紅框內佈局高度超過其父佈局即可,是不是比另寫1個更高的佈局簡單些!
9、
for (int i = 0; i < mTabViews.length; i++) {
mTabViews[i].setOnClickListener(this);
}
像這種把數組或集合的size寫入循環中是不合理的,每次循環都會計算size並創建int對象,所以應該這樣寫合理些
int size = mTabViews.length;
for (int i = 0; i < size ; i++) {
mTabViews[i].setOnClickListener(this);
}
10、針對Map,以下幾種情況不要使用Map
如果key是int類型,則使用SparseArray;
如果key是long類型,則使用LongSparseArray;
如果value是int,則使用SparseIntArray;
如果value是boolean,則使用SparseBooleanArray;
如果value是long,則使用SparseLongArray;
11、執行shell腳本./方式和bash方式是有區別的,bash是重開進程執行腳本,並且不需要腳本具有可執行權限;./則需要腳本具有可執行權限,否則報權限拒絕錯誤,./不是重開進程執行。
12、在主線程刷新view調用invalidate好於postInvalidate,後者需要通過handler然後調用invalidate;在子線程就必須用postInvalidate了。
13、使用內部類時儘量使用靜態內部類,可避免潛在的因內部類導致的內存泄漏。
14、一個複雜的業務邏輯不要用一個方法或類實現,要進行邏輯分層,不同的子邏輯做自己的事,使代碼層次分明,易於維護。
15、單例模式不能用於跨進程通信。
二、踩坑篇
1、Relativelayout佈局,View1相對於View2存在時,若設置View1的visibility爲Gone,則View2的相對於View1的位置失效,佈局錯誤,此類建議設置爲INVISIBLE。
2、垂直的RecyclerView嵌套水平的RecyclerView時,水平的RecyclerView的高度要手動測量指定,因爲系統測量的高度是錯誤的。
3、寫循環時切忌要避免死循環,可以用1個最大循環值以控制循環次數。
4、在RecyclerView列表的條目中不能判斷圖片的url是否爲空然後再用Fresco的SimpleDrawView控件加載圖片,因爲來回滑動可能會複用錯誤的圖片到url錯誤或爲null的item上,直接加載即可。
5、上線項目時一定一定一定要測試核心功能,比如數據統計等。
6、linux命令千萬別執行 rm -rf 命令,這幾乎是毀滅性的。
7、重要的數據比如shell腳本、配置文件等記得備份,未來很有可能你會用到。
8、使用SurfaceView播放視頻時,記得SurfaceHolder.addCallback()一定要在SurfaceView實例化之後就調用,否則可能導致addCallback()方法執行之後遲遲不走surfaceCreated()回調方法。
9、在Manifest文件中對Activity標籤配置了android:configChanges="orientation|keyboardHidden|screenSize"
橫豎屏切換時,就不會走onCreate(),而是回調onConfigurationChanged()方法,因此也不會自動加載layout-land目錄下的橫屏佈局。
10、自定義View偶現setVisibility(View.VISIBLE)後不顯示,通常手動在主線程調用invalidate()或在子線程調用postInvalidate()可解決。也可以試試在佈局文件中不要設置爲gone,而是用invisible代替。
11、View.setLayoutParams(layoutParams)不生效可以用這種方式:
view.post(new Runnable() {
@Override
public void run() {
view.setLayoutParams(lp);
}
});
12、SharedPreference在不同的進程進行存取操作會產生取不到存入的值的後果,所以使用SharedPreference的時候要保證在同一個進程中。
13、如果需要用WebView預加載h5頁面,則用getApplicationContext()進行初始化WebView,以規避內存泄漏的風險,但是以此方法會造成onJsAlert回調的彈框無法顯示。所以h5的一些彈框邏輯建議不用alert彈框方式實現!
14、js調用native的方法不在主線程,所以一些UI操作等要切換到主線程處理。