给Android程序员的六个建议
如果你一年前写的代码 , 在现在看来你还感觉写的很不错 , 那么说明你学习的不够多.
不要在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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
这个毛病可能很多人都会犯过 , 如果
MeTrackerStore
通过构造持有activity
的引用 , 那这个activity
就永远不会被垃圾回收.(除非静态变量被重新分配至不同的activity
)这是因为
MeTrackerStore
是静态的 , 而对于静态变量的存储, 当应用程序启动 , 不收集 , 知道退出该应用程序正在运行的进程 .注: 从技术层面来说 , 你可以持有一个静态应用的
application 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();
//..
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
这段代码有很多问题 , 我们把终点放在隐式引用 . 在Java中 , 对于包含静态内部类的类 , 非静态内部类具有隐式引用.
本段代码中 , 对与外部类
DefineGeofenceFragment
将持有一个GetLatAndLongAndUpdateMapCameraAsyncTask
引用对与包含内部类的外部类来说 , 他们有一个隐含的引用包含匿名类的类的实例 , 该
GetLatAndLongAndUpdateMapCameraAsyncTask
有一个隐含的引用片段Android Studio 让你更快捷, 更舒服
AS提供的快捷键和live templates,会让你写起代码飞快,目前Android Studio已经可以支持NDK开发,日后会有越来越多的人喜欢Andriod Studio并使用它来开发。- 一个方法只做一件事
有一个在我写这超过100行的类之一的方法。这样的方法难以阅读,修改和重新使用。试着写的方法只能做一件事。通常情况下,这意味着你应该怀疑的是超过20行代码的方法。在这里,你可以招募的Android Studio来帮助你发现问题的方法。 向比你有经验的人学习
这可能听起来微不足道,但它是一个错误,我做的时候,我写我的第一个应用程序。
当你写一个应用程序,你会犯错误。其他人已经取得了这些错误。从这些人的了解。你是在浪费你的时间,如果你重复别人的可以避免的错误。我浪费了大量的时间在我的第一个应用程序使得我本来可以避免,如果我只是花了一点时间,从经验丰富的软件开发人员学习错误。
阅读程序员修炼。然后阅读有效的Java。这两本书将帮助你避免我们作出开发新手常犯的错误。当你与那些书做,不停地寻找聪明的人学习的榜样。多使用第三方库
当你写一个应用时 , 你可能会遇到更聪明 , 更有经验的人已经解决了你的需求或问题. Android 有很多开源库 , 我们可以多利用他们。
在我的应用中 , 我经常使用第三方库提供的功能 , 比如 Retrofit 和 Picasso . 如果你不确定你需要哪种类型或功能的库 , 下面介绍一下比较流行的几款库:1. Google 广播 (http://fragmentedpodcast.com/episodes/9/) , 告诉你什么情况 使用什么库 , 例如 Dagger Retrofit Picasso 和 Mockito
2. 订阅Android周刊 . 他们会给你推送最新的第三方库或比较最新 , 最近比较流行的设计模式及功能.
3. 寻找开源代码的应用 去解决类似你需要的功能或模块. 这个应用可能会用到你不知道的第三方库.
版权声明:本文为博主原创文章,未经博主允许不得转载。
给Android程序员的六个建议的更多相关文章
- 给Android程序猿的六个建议
假设你一年前写的代码 , 在如今看来你还感觉写的非常不错 , 那么说明你学习的不够多. 不要在Context中持有静态引用 public class MainActivity extends Loca ...
- IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架
每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...
- Android 程序员必须知道的 53 个知识点
1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- 迈向高阶:优秀Android程序员必知必会的网络基础
1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...
- (转载) 据说年薪30万的Android程序员必须知道的
据说年薪30万的Android程序员必须知道的帖子 标签: android 2015-03-12 16:52 28705人阅读 评论(14) 收藏 举报 Android中国开发精英 目前包括: And ...
- 面试利器!字节跳动2021年Android程序员面试指导小册已开源
整份手册分为两个部分,分别是:Java部分.Android部分.数据结构与算法篇.字节跳动2020年全年面试题总结篇! 每个知识点都有左侧导航书签页,看的时候十分方便,由于内容较多,这里就截取一部分图 ...
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- Android高薪之路-Android程序员面试宝典
Android高薪之路-Android程序员面试宝典
随机推荐
- .net学习笔记----二级域名站点共享Session状态
前面一篇文章提到了如何在使用了ASP.NET form authentication的二级站点之间共享登陆状态, http://www.cnblogs.com/jzywh/archive/2007/0 ...
- 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)
简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...
- Redis/SSDB+Twemproxy的配置与使用(Mac/Linux平台)
对于redis而已,相信不少的后台开发人员一直都在使用,相比memcache而已,redis不仅可以作为key-value缓存使用,而且提供了丰富的数据结构如set.list.map等,能够实现很多复 ...
- Hark的数据结构与算法练习之地精(侏儒)排序
算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小 ...
- js:数据结构笔记14--高级算法
动态规划: 递归是从顶部开始将问题分解,通过解决所有分解出小问题来解决整体问题: 动态规划从底部开始解决问题,将所有小问题解决,然后合并掉一个整体解决方案: function dynFib(n) { ...
- Visual Studio提示Bonjour backend初始化失败
Visual Studio提示Bonjour backend初始化失败 错误信息:The Bonjour backend failed to initialize, automatic Mac Bui ...
- swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程
swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程 1.2.3 注册非免费苹果账号swift语言注册非免费苹果账号iOS游戏框架Sprite Kit基础教程 免费的苹果账号在 ...
- JAVA定时执行任务的三种方法
1.利用 java.util.Timer 这个方法应该是最常用的,不过这个方法需要手工启动你的任务 Timer timer=new Timer(); timer.schedule(new ListBy ...
- 游戏 scrollView
using UnityEngine; using System.Collections; public class LLL : MonoBehaviour { Vector2 scrollPositi ...
- HTML6 展望
HTML5 概述 HTML5 是 HTML 语言最受欢迎的版本之一,它支持音频和视频.离线存储.移动端.和标签属性等等.还提供了<article>, <section>, &l ...