在我写个人第一个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是很是难的。不要由于重复个人错误让它变的更加艰难。

相关文章
相关标签/搜索