阅读更多
本文出自:Philosophical Hacker,译文出自:开发技术前线,译者:dengshiwei
我的第一个应用非常糟糕。事实上,它糟糕得以致于我从应用市场上删除它,同时我甚至都不会在我的简历上罗列出它。如果我在开发之前能够知道一些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; 
    //...
    @Override
    protected 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> {

        @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中,(非静态)内部类有个对外部类实例有个隐式引用。

在这个例子中,任何GetLatAndLongAndUpdateCameraAsyncTask都有一个外部类DefineGeofenceFragment的引用。对于匿名类是同样的,它们也有一个对包含它们的类的实例的一个隐式引用。

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’。



Android Studio能够做的远不止于此。学习Android Studio从学习快捷键模版是不错的开始。

4. 一个函数只做一件事

在我写的众多类中,有一个类的一个方法我便写了有100多行。这类的方法是非常难以读懂、修改和重用,努力让一个方法只做一件事情。显然,这意味着你应该对超过20行的方法持有怀疑态度。这里,你可以使用Android Studio来帮助你发现有问题的方法:



5. 向聪明和有经验的人学习

这可能听起来微不足道,但是这是我开发第一个应用时候犯下的错误。

当你开发一个应用的时候,你会犯别人已经犯过的错误。向别人学习,你可以避免犯别人犯过的错误来节约你的时间。我在我的第一个应用中浪费了大量的时间去犯错,这些错误如果我花点时间向有经验的软件开发工程师学习就可以避免。

阅读Pragmatic Programmer,然后阅读Effective Java。这两本书会帮助你避免开发新手常犯的错误。在你学习了这两本书后,不停地寻找聪明的人并向他们学习。

6.使用类库

当你开发应用的时候,你可能会遇到一些聪明人和有经验人已经解决过的问题。而且,许多这些问题的解决方案是可以作为开源库的,充分利用它们。

在我的第一个应用中,我写了一些类库已经提供的功能代码。其中一些是Java标准库,还有一些是第三方类库,如Retrofit和Picasso。如果你不确定你使用什么样的类库,你可以做下面3件事情:
  • Google IO Fragmented广播。在这期间,询问这些开发者什么第三方类库类库对Android很重要。
  • 订阅Android周刊。这里包含了一部分最新的类库,时刻注意哪些对自己有用。
  • 寻找那些能够解决与你在开发应用中遇到问题类似的开源应用。你可能发现某个应用使用的第三方类库就是你想要的,或者你会发现一个你所不知道的Java类库。

总结

开发优秀的Android应用是非常困难的,不要用重蹈覆辙来难为自己。如果你发现我写的代码中的错误请在评论中告诉我。(误导性评论比没有评论更糟糕)。如果你认为这篇文章对于新手开发者有用,请分享它,以解决他们的一些令人头疼的难题。

本文出自:Philosophical Hacker,译文出自:开发技术前线,译者:dengshiwei
  • 大小: 17.2 KB
  • 大小: 22.3 KB
2
0
评论 共 1 条 请登录后发表评论
1 楼 zhangchunyu275 2015-07-31 14:38
         

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 【运维面试】你们公司有多少台服务器?

    这个在面试的时候经常会被问到,尤其是你面试的4年以下工作经验的时候。 一般与这个问题相关的是: 你们公司有多少服务器? 你们用的技术栈是什么? 你们怎么维护这么多服务器的? 你在公司负责多少台? 你维护的...

  • 有人参加过CSDN超级实习生计划吗?靠谱吗?

    CSDN近期推出了超级实习生计划,相比市面上同类型实习类产品,超级实习生计划服务群体范围更小一些,主要服务于有志于从事IT行业的...那么至今为止有人参加过CSDN超级实习生计划吗?这个产品真的能找到大厂实习,靠谱吗?

  • 有人在开课吧学习过吗?值得信任吗?教学质量如何?

    问:开课吧值得信任吗?...在你们周边做IT的朋友中,几乎都有在开课吧学习过的经历。 时间是最好的老师,经历7年的开课吧一直在完善人才服务,也经得起岁月的磨练。所以IT培训的老品牌,是值得信任的。 问:开课吧的教

  • 开机提示有人正在使用计算机,查看电脑有没有被他人使用过的三种方法

    离开电脑一段时间忘记锁屏,不知道别人有没有动过电脑,我们都不希望自己的私人电脑随便被其他人乱动或使用。如果当面询问比较尴尬,有什么其他办法能够查询到?查询方法当然有的,接下来小编和大家分享一下查看电脑...

  • Java面试不通过?这篇文章你看了吗?

    注:本人才疏学浅,知识还在积累中,不能保证每个回答都满足各种等级的高手们,(由于一些技术的升级,部分答案不能保证实时同步准确,还请大家在阅读的时候多多留意)若发现有问题的话,请评论指出。.......

  • 阿里巴巴为什么不用 ZooKeeper 做服务发现?

    2008 年底,淘宝开启一个叫做“五彩石”的内部重构项目,这个项目后来成为了淘宝服务化、面向分布式走自研之路,走出了互联网中间件体系之始,而淘宝服务注册中心 ConfigServer 于同年诞生。 2008 年前后,Yahoo 这...

  • 电信副卡显示无服务器,电信副卡,你从来就是一个陷阱吗?

    电信副卡,你从来就是一个陷阱吗?前年,在某电信营业厅,经不起工作人员的热情推介,我办了一张副卡。副卡是跟自己的电话卡(主卡)绑定在一起的另一张电话卡,副卡和主卡共享话费和流量,主副卡之间无限通话,副卡...

  • 什么是云计算?什么是云服务器?有什么用?

    很多人都听过云计算和云服务器这几个概念,那么到底什么是云计算、什么是云服务器呢?云服务器又有什么用呢?提供阿里云、腾讯云特惠1折秒杀活动的“尊托云数-zuntop.com”就带大家一起来了解一下。 云计算(cloud ...

  • 有人串口转wifi模块 httpd client通信示例-用户使用网页通过服务器收发串口数据源码 小黄人软件

    有人串口转wifi模块 httpd client通信示例-用户使用网页通过服务器收发串口数据 功能:用户使用网页通过服务器收发串口数据,转发信息通过文件转存。网页自动更新串口发来的数据,网页发送数据到串口,串口接收要...

  • 面试最后一问:你有什么问题想问我吗?

    尽管,我们之前分享了这么多关于面试的主题: 高薪必备的一些Spring Boot高级面试题 面试必问:设计模式遵循的面向对象设计原则! 面试必问:怎么保证缓存与数据库的双写一致性?...然而,最后这个90%可见...

  • 2020年了,居然还有人在用asp

    近日,一个风和日丽的上午,忽然接到老大安排的一个任务:给一个asp的小项目添加判断文件是否存在,如存在就跳转显示的功能。 嗯...是的,你没看错,不是php、也不是asp.net,就是asp,可能有些年轻的小伙伴们都不...

  • 公众号知道我浏览他吗_浏览微信公众号会有记录吗?我们应该如何寻找记录?公众号浏览记录怎么查看?...

    你有没有浏览过微信公众号?你知不知道浏览微信公众号会不会有记录呢?我们都知道微信公众号是微信里非常重要的功能,我们经常会用到微信公众号,最近很多微信用户问我浏览公众号会有记录吗?我们应该如何寻找记录?下面...

  • ChatGPT 会开源吗?

    网上有人说它是搜索引擎杀手,还有人说它将取代程序员...最后,我还是没扛住铺天盖地的赞美,跑去注册了个账号,抱着调侃“人工智障”的心态,想要调戏 ChatGPT 一番。于是就有了下面的对话:此时,我内心毫无波澜。...

  • windows和linux服务器哪个好?有哪些区别?

    在安装服务器系统环境的时候,... 最早,投身到Linux阵营当中的是一些想完全掌握自己的命运、想通过自身努力优化这个世界的理想家,而随着Linux的成熟,不断有更多的人因为Linux适合他们特定的需要而选择Linu...

  • 一台服务器最多多少个线程,一个电脑最多能开启多少个线程?

    —-一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在...—-有连接就开一个线程的设计和上次一个人说要做一...

  • 珍爱网有人退费成功吗?珍爱网退费流程攻略详解大全!

    而珍爱网为了为大家提供更好的服务,是有着388元一年的会员费的,这个钱大多数都用来维持平台的发展和运营,好为大家提供更优质的服务。当然珍爱网并不是万能的,当缴纳了金钱之后,当人们觉得自己没有得到应有的...

  • 面试官:服务器安装 JDK 还是 JRE?可以只安装 JRE 吗?

    前些日子有知友面试时被问到如题所示的问题,由于他之前没有准备到这些最最基础的知识,没有考虑过这个问题,所以被问到时竟一脸萌币,回答的不是很好。这道题主要考的是对 Java 基础知识的了解,有些同学可能已经忘...

  • 中台到底是个什么鬼?终于有人讲清楚了!

    有人会说了,你不能拿遗留系统说事儿啊,我们可以新建后台系统啊,整个2.0问题不就解决了。 但就算是新建的后台系统,因为其管理的是企业的关键核心数据,考虑到企业安全、审计、合规、法律等限制。导致其同样往往⽆...

  • 还有人在用SQL Server 2000或2005吗? 2014来了!

    很多人甚至还没有来得及用过SQL Server 2008,SQL Server 2012,现在SQL Server 2014已经出来了!在今年的TechEd大会上,微软宣布SQL Server 2014第一个技术预览版,并且将于本月正式提供下载,而产品正式发布时间...

  • 有了服务器,域名,如何将静态网页放到服务器上,让所有人都能访看到?

    前两天自己买了百度云服务器和域名,然后写了一个静态的网页,准备把这个静态的网页放到服务器上去,这样的话,任何人输入网址,都可以看到我写的这个静态网页;于是这两天一直在研究这东西要怎么做才能实现,零零散...

Global site tag (gtag.js) - Google Analytics