摘要: 先看一个例子: private static Drawable sBackground; @Override protectedvoid onCreate(Bundle state){ super.onCreate(state); TextView label =newTextView(this); label.setText("Leaks are bad"); if(sBackground ==null){ sBackground = getDrawable(R.drawable.large_bitmap); } label.s... 阅读全文
posted @ 2013-05-09 22:02 屁颠 阅读(3104) 评论(0) 推荐(0) 编辑
摘要: 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ⑸ 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 "select uid, name from user"); 7 while (rs.next()) 8 { 9 ... 阅读全文
posted @ 2013-05-02 13:23 屁颠 阅读(948) 评论(2) 推荐(1) 编辑
摘要: 最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器, 反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题这么说起来比较笼统,接下来我会根据问题,把一些实例代码贴出来,一步一步分析,在 具体的场景下,用行之有效的方法,找出泄露的根本原因,并给出解决方案。 现在,就从cursor关闭的问题开始把,谁都知道cursor要关闭,但是往往相反,人们却常常忘记关闭,因为真正的应用场景可能并非理想化的简单。1. 理想化的cursor关闭Cursor cursor = db.query();Lis... 阅读全文
posted @ 2013-04-06 23:35 屁颠 阅读(466) 评论(0) 推荐(0) 编辑
摘要: 一、Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有 对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的原理。Java将引用关系考虑为图的有向边,有向边从引用者 指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。 阅读全文
posted @ 2013-03-15 15:50 屁颠 阅读(880) 评论(0) 推荐(0) 编辑
摘要: 1、视图背景的优化视图的背景是根据视图的大小自动调节的。不管图像的尺寸是多大,如果图像做为视图的背景的时候,图像会自动缩放来匹配填充视图的大小。当视图大小和背景图片的尺寸不匹配的的时候,系统会自动的缩放图片。这样的自动调整如果多次甚至大量的出现在我们的应用中,那么势必会造成程序加载到延时、效率降低。 那么我们如何尽量的避免自动缩放呢?一、提供的背景图片正好和视图的大小一致我们在制作程序的时候选择的背景图片正好和视图的大小一致,这样可以避免背景图标的自动缩放。有些时候我们受到一些因素的制约可能做不到这一点。例如横竖屏的差异、图片来源不受我们控制等等原因。那么这个时候我们可以考虑将图片进行预先缩放 阅读全文
posted @ 2013-03-15 15:36 屁颠 阅读(644) 评论(0) 推荐(0) 编辑
摘要: HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告。意思就是说用SparseArray<E>来替代,以获取更好性能。老实说,对SparseArray并不熟悉,第一感 觉应该是Android提供的一个类。按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类。单纯从字面上来理解,SparseArray指的是稀疏数组(Sparse array),所谓稀疏数组就是数组中大部分的内容值都未被使 阅读全文
posted @ 2013-03-14 14:01 屁颠 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 1)静态变量引起内存泄露在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销 毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到程序退出。如果不注意,静态变量引用了占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。先来看一段代码,这段代码定义了一个Activity。private static Resources mResources; @Overrideprotected void onCreate(Bundle state) {super.on 阅读全文
posted @ 2013-03-14 11:19 屁颠 阅读(261) 评论(0) 推荐(0) 编辑
摘要: android系统的应用程序(至少T-Mobile G1)被限制16M堆大小范围内。设备拥有很多的内存但是开发者想要得到却很少。即使你不想使用设备所有的内存,你也应该在不杀死其他应用程序的情况下使 用最少(的内存)。越多的程序在内存中,用户切换程序的速度就越快。在我的一部分工作中,我遇到一些内存问题他们大部分都源于一个错误:保持长时间引用Context(简单说就是Context泄露)。 android系统里,Context被常用来加在和使用资源。这也是为什么很多Widget在够找函数中接受一个Context的参数了。在 一个通常的android应用里,你经常可以使用两个Context(A... 阅读全文
posted @ 2013-03-11 17:01 屁颠 阅读(1185) 评论(0) 推荐(1) 编辑
摘要: Android 开发中,不良的布局文件【比如:不必要的嵌套,过多的视图,嵌套太深】,很容易引起系统开销过大、程序不稳定等等。在window平台下,可以通过layoutopt.bat快速地使用layoutopt分析功能。该bat文件位于android-sdk-windows\tools目录下。sdk 16下layoutopt.bat改名为lint.bat了用法:1.cmd进入tools目录下2.输入lint+xml的完整路径【如图】3.自动输出结果例如:主要有3种类型需要注意:1.无用的布局如上图 ThisLinearLayoutlayoutoritsLinearLayoutparentisus 阅读全文
posted @ 2013-03-05 14:29 屁颠 阅读(1125) 评论(0) 推荐(0) 编辑
摘要: 无 论怎么小心,想完全避免badcode是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。 Androidtools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情 况类似)。用Heap监测应用进程使用内存情况的步骤如下:1.启动eclipse后,切换到DDMS视图,并确认Devices视图、Heap视图都是打开的;2.将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式;3.链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息 阅读全文
posted @ 2013-03-05 10:26 屁颠 阅读(6200) 评论(0) 推荐(1) 编辑