开发第一个Android应用之前你需要知道的六件事

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面 。如果您想投稿、参与内容翻译工作,或寻求近匠报道,请发送邮件至tangxy#csdn.net(请把#改成@) 。
我的第一个应用非常糟糕 。事实上,它糟糕得以致于我从应用市场上删除它,同时我甚至都不会在我的简历上罗列出它 。如果我在开发之前能够知道一些Android开发的事情,也不会糟糕到这步田地 。
本文中所罗列的事情是你在开发第一个Android应用的时候需要牢记在大脑中的 。我接下来将展示的实际错误均来自于我的第一个应用程序代码中 。把这些错误经验牢记心头能够帮助你开发一个让你引以为豪的应用 。
当然,正如Code Standards所说:如果你所做的工作和你作为学生开发的Android应用类似,你很有可能会讨厌你的应用 。

如果一年前你写的代码对于你来说感觉还不错,你很大程度上没有进行足够的学习 。 
——Code Standards 2015.5.21
如果你是一位经验丰富的JAVA开发者,第1、2、5条很有可能对你没有吸引力 。另一方面,即使你从来没有犯过这些例子中的错误,第3、4条也可能向你展示一些很酷的事物,你可以利用一款也许你不知道的软件——Android Studio去实现这些事物 。
 
1. 不要持有Context的静态引用public class MainActivity extends LocationManagingActivity implements ActionBar.OnNavigationListener,googlePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener {//...private static MeTrackerStore mMeTrackerStore;//...@Overrideprotected void onCreate(Bundle savedInstanceState) {//...mMeTrackerStore = new MeTrackerStore(this);}}这对于每个人来说看似是一个不可能犯的错误 。但事实却并非如此,我犯了这个错误,我也看到过别人犯这个错误,同时我也采访过那些不能很快指出为什么这是放在第一位的错误的人 。不要这样做,它是会变的 。
如果MeTrackerStore通过它的构造函数保持一个指向Activity的引用,这个Activity将不会被垃圾回收(GC),除非静态变量被从新分配到不同的Activity 。这是因为mMeTrackerStore是静态变量,而静态变量的内存是不会被回收,直到应用程序退出才回收 。如果你正在试图做这样的事情,你的代码很有可能有严重的错误 。寻找帮助吧,可能看看Google的Udacity课程“Android Development for Beginners”能够帮助你 。
注:从技术上说,你可以对一个Application Context进行静态变量引用而不引起内存泄露,但我不建议你这样做 。
 
2. 注意那些你无法控制生命周期的对象的隐式引用public class DefineGeofenceFragment extends Fragment {public class GetLatAndLongAndUpdateMapCameraAsyncTask extends AsyncTask<String, Void, LatLng> {@Overrideprotected LatLng doInBackground(String... params) {//...try {//Here we make the http request for the place search suggestionshttpResponse = httpClient.execute(httpPost);HttpEntity entity = httpResponse.getEntity;inputStream = entity.getContent;//..}}} }这段代码有很多问题,但我现在只会把重点问题放在“隐式引用”那些问题上 。在Java中,(非静态)内部类有个对外部类实例有个隐式引用 。
在这个例子中,任何GetLatAndLongAndUpdateCameraAsyncTask都有一个外部类DefineGeofenceFragment的引用 。对于匿名类是同样的,它们也有一个对包含它们的类的实例的一个隐式引用 。
【开发第一个Android应用之前你需要知道的六件事】GetLatAndLongAndUpdateCameraAsyncTask对生命周期我们无法控制的Fragment对象有一个隐式引用 。Android SDK负责创建和销毁Fragment,如果GetLatAndLongAndUpdateCameraAsyncTask 因为正在运行而不能被垃圾回收,那么DefineGeofenceFragment也将因为具有隐式引用而保留不能被垃圾回收 。
这里有一个很棒的Google视频,解释它为什么会发生这种事情(友情提示:需自备梯子哈) 。
 
3. 使用Android Studio进行工作public ViewPager getmViewPager {return mViewPager;}这段代码是我使用“Generate Getter”在Android Studio中进行生成的 。这些getter保持了’m’前缀的实例变量,同样通过它也能为一个方法产生相同的效果,这已经不是空想 。
(如果你想知道为什么’m’是实例变量的名称的第一个字母,’m’往往是实例变量的公认约定 。它代表了’member'(成员)的意思) 。
不管你是否认为实例变量的前缀’m’是一个好注意,在这有一个知识,Android Studio能够帮助你编写任何你想要实现的公认约定 。例如,在你为实例变量生成getters、setters和connstructor参数时,你可以使用Android Studio代码风格对话框的设置使Android Studio在你的实例变量前自动添加’m’和移除’m’ 。


推荐阅读