Android開發中的技巧和踩坑

這篇博客持續更新自己總結的一些在項目開發中碰到的坑或者技巧,上篇是技巧篇,下篇是踩坑篇。藉此以起到警示自己和幫助大家的作用!

一、技巧篇

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操作等要切換到主線程處理。

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