天天看點

再次探讨Android開發值得注意的規範

上一篇部落格,我已經談及一些有關Android開發值得注意的規範。在此基礎上,來擴充探讨其他容易引發不規範程式設計的細節問題。

一、線程同步問題

很多時候,都需要開多個線程并發工作。但是,如果使用共享變量來實作線程之間通信,可能兩個甚至多個線程同時通路某個變量,導緻變量混亂引發死鎖。為了實作線程同步,變量采用synchronized關鍵字作為同步鎖。

用法如下-->

private Timer timer = null;
private void cancelNotification() {
    if (timer != null) {
          synchronized (timer) {
            ...
        }
    }
}           

二、捕獲異常問題

執行一個方法可能會抛出多個異常,那麼需要同時捕獲這些異常并進行适當處理。這時會出現多個catch并行書寫,顯得不夠簡潔,可以把多個Exception采用或表達式寫在一起。另外,catch裡面最好進行恰當處理,比如使用log列印日志以便排查問題。最後,加上finally進行處理。

用法如下-->

try {
   ...
} catch (OutOfMemoryError | Exceptio e){
    Log.e("mError",e.toString());
}finally{
   ...
}           
三、全局與局部      
我清晰地記得C語言老師多次強調:能夠使用局部變量(private)就不要使用全局變量(public),盡量減少使用全局變量。同理,能夠使用私有方法,就不要寫成公有方法。能夠寫成本地變量,就沒必要寫成成員變量。      
四、if表達式      
if表達式用于條件語句判斷,有時候可以簡化,有時候沒必要if{}與else{}成對出現。      
情景1:      
if表達式簡化前-->      
if (account.isExist()) {
           return false;
        }
        return true;           
簡化後-->
return !account.isExist;           
情景2:
if與else成對出現-->      
if(a == null){
   return;
}else {
   ...
}           
隻需要if判斷-->
if(a != null){
   ...
}           
五、布爾表達式
衆所周知,布爾表達式隻有兩個狀态true和false,有時候return boolean值與結合if條件語句來寫,可以直接使用布爾表達式更加簡潔些。      
情景1:      
boolean值與if語句結合-->      
if(a > b){
   return true;
}else {
   return false;
}           
直接使用布爾表達式-->
return a > b;           
情景2:
布爾變量與true/false比較-->      
if(a == true){
   ...
}           
直接使用布爾變量本身-->
if(a){
   ...
}           
六、"HardCode"引用
android studio很有意思,使用自帶的lint靜态代碼檢查時,可以檢測出固定或指定(HardCode)代碼片段引用,并且給出對應解決方法。      
例如擷取sd卡路徑-->      
public final static String DATA_URL = "/data/data/";           
恰當用法-->
public final static String DATA_URL = Context.getFileDir().getPath();           
七、線性布局的權重 線性布局提供權重(weight)配置設定,如果在使用weight屬性的情況下,高度或者寬度使用0dp代替wrap_content或者match_parent,性能會相對好些。
weight與wrap_content結合使用-->      
android:layout_height="wrap_content"
android:layout_weight="1"           
weight與0dp結合使用-->
android:layout_height="0dp"
android:layout_weight="1"           
八、cursor對象 需要從資料庫查詢資料時,通常是利用cursor對象進行資料查詢。但是很多時候,cursor使用完畢忘記關閉它。此時,靜态代碼檢測後會抛出missing recycle()calls這樣提示。那麼,我們需要調用close()方法釋放cursor。
九、注意view的重繪

    在xml布局裡面,我們往往會利用background屬性自定義背景色。此時靜态代碼檢測後會提示"OverDraw:Painting regoins more than one"。事實上,我們已經在AndroidManifest.xml檔案配置過activity窗體布局的背景色。android:theme="@android:style/Theme.Light.NoTitleBar"。現在呢,在xml父布局又自定義背景色。android:background="@color/white"。這樣就造成了view的重繪,影響app的性能。      
最後,我想說的是,本人程式設計初期也不注重開發規範。以上是我個人對開發規範的一些總結,如有錯漏希望大家及時指出共同進步。我寫下這篇部落格初衷是,讓自己更加注重開發規範,養成編寫規範代碼的習慣,以此自勉。同時,也共勉徘徊在不規範大門的同行,開發規範牢記于心,從細節做起,從現在做起。      

繼續閱讀