在我寫個人第一個Android App時,我但願我能知道的6件事

更多android相關文章http://www.codefrom.com/p/Androidhtml

個人第一個app是糟糕的。實際上,它太糟糕了,因此我把它從商店中移除,我甚至再也不因我把它列在個人簡歷之中而煩惱。若是我在寫它以前,知道一些有關Android開發的事,那個app就不會那麼糟糕。java

當你寫你的第一個Android app時,這有一個列表你須要記着。這些經驗教訓是我在寫第一個app源碼時,犯下的真實的錯誤。我將會在後面展現這些錯誤。記住這些事情能幫助你寫一個讓你感到有點自豪的app。android

固然,若是你做爲一個Android開發的學生正在作正確的工做,不管如何,不久後你都有可能恨你寫的app,正如@codestandards所說,若是你一年前碼的代碼並不能讓你感受到不適,那你有可能沒怎麼學習。android-studio

若是你是一個有經驗的Java開發者, 第1,2和第5條可能並不能讓你感興趣。另外的第3,4條可能展現你一些很酷的但你可能還不知道的東西。app

Contexts不要有靜態引用

public class MainActivity extends LocationManagingActivity implements ActionBar.OnNavigationListener,
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {

    //...

    private static MeTrackerStore mMeTrackerStore; 

    //...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //...

        mMeTrackerStore = new MeTrackerStore(this);
    }
}

這可能看起來對任何人來講,都是一個不可能犯的錯誤。但並不是這樣,我就犯過。我也看到其餘人犯過這樣的錯誤,而且我也看到不少人並不能在第一時間指出爲何這是一個錯誤。不要這樣作。它是一個noob moveide

若是當這個Activity傳遞到它的構造函數裏,MeTrackerStore持有這個Activity的引用,那這個Activity將仍然不會被回收(除非這個靜態變量被從新賦值給另外一個Activity)。這是由於mMeTrackerStore是靜態的,靜態變量的內存是不會被回收的,直到程序里正在運行的進程中止。若是你發現本身嘗試這麼作,那麼你的代碼可能有一些嚴重的錯誤。尋找幫助的話,能夠看看Google’s Udacity裏的課程 「Android Development for Beginners」函數

注意:技術上講,你能夠hold一個對Context的靜態引用,但不會引發內存泄漏,但我不會推薦你這麼作。學習

小心對那些你沒法控制它的生命週期的對象進行隱式引用

public class DefineGeofenceFragment extends Fragment {
    public class GetLatAndLongAndUpdateMapCameraAsyncTask extends AsyncTask<String, Void, LatLng> {

        @Override
        protected LatLng doInBackground(String... params) {
            //...
            try {
                //Here we make the http request for the place search suggestions
                httpResponse = httpClient.execute(httpPost);
                HttpEntity entity = httpResponse.getEntity();
                inputStream = entity.getContent();
                //..
            }
        }
    }


}

這段代碼有不少問題,但我將關注其中的一個。在Java中,非靜態的內部類對包含它的類對象有一個隱式的引用。this

在這個例子中,任何GetLatAndLongAndUpdateMapCameraAsyncTask對象都將有個DefineGeofenceFragment對象的引用。匿名類也是如此:它會對包含它的類對象有個隱式的引用。idea

這個GetLatAndLongAndUpdateMapCameraAsyncTask對象對Fragment對象有個隱式的的引用,一個咱們沒法控制它生命週期的對象。Android SDK負責適當的建立和銷燬Fragment對象,若是由於GetLatAndLongAndUpdateMapCameraAsyncTask對象正在執行因此不能被回收的話,那它持有對象也沒法被回收。

這裏有一個很棒的Google IO 視頻解釋爲何這種事會發生

讓Android Studio爲你工做

public ViewPager getmViewPager() {
    return mViewPager;
}

這個片斷是我使用」Generate Getter」代碼補全時,Android Studio爲我生成的,這個getter方法對這個實例變量保持了’m’前綴。這並不理想。

(另外,你必定想知道爲毛實例變量神明的時候要帶個’m’前綴:這個’m’經常被約定做爲實例變量的前綴。它表明了’member’。)

不論你是否定爲’m’做爲你實例變量的前綴是一個好主意,這裏有一個經驗:Android Studio能夠幫你按照你養成的習慣去編寫代碼。好比說,你可使用Android Studio中的代碼風格框去讓Android Studio自動的加上’m’到你的實例變量而且自動移除’m’當它生成getters,setters,和構造參數時。

Android Studio能夠作不少事情,學習快捷鍵活動模版會是一個好的開始。

方法應該只作一件事

有一個方法我寫超過了1000行。這樣的方法很難讀懂,修改和重用。試着寫僅僅作一件事的方法。典型的,這意味着你應該懷疑那些你寫超過20行的代碼。這裏你能夠招募Android Studio去幫助你指出有問題的方法:

向那些比你更聰明,更有經驗的人學習

這好像挺起來不重要,可是這是我寫第一個app時犯下的錯誤。

當你正在寫程序時,你將會犯錯。其餘的人已經犯過這樣的錯誤了。向其餘人學習。若是你重複那些能夠避免的錯誤,那你就是在浪費時間。

讀Pragmatic Programmer. 而後讀Effective Java.這兩本書會幫助你避免犯一些常見的錯誤。當你讀完這兩本書後,保持向聰明的人學習。

使用庫

當你寫一個app,你可能會遇到那鞋前人已經解決了的問題。並且,大量的解決辦法都是開放的做爲資源庫。 好好利用他們。

在個人第一個app中,我寫的功能已經被其餘庫所提供了,它們中的一些庫來自於標準的java中的一部分。另外一些則是像Retrofit和Picasso這樣的庫。若是你不肯定你要應該用什麼庫,你能作3件事:

1.聽Google IO Fragmented podcast episode
2.訂閱Android Weekly
3.尋找解決相似問題的開源應用。你可能發現它們用了第三發的庫(third-party library)或者用了你並無在乎的標準的java庫。

總結

寫一個好的Android app是很是難的。不要由於重複個人錯誤讓它變的更加艱難。

相關文章
相關標籤/搜索