存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。 454.
1.对于常规开发者而言需要了解 Java的四种引用方式,比如强引
用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。 2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里Android123提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。 3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory() 455.
freeMemory() 两个方法获取VM的一些内存信息,对于系统heap
内存获取,可以通过Dalvik.VMRuntime类的getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的
gcSoftReferences() 方法,获取更多的运行内存。 4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。 5. 不要在循环中创建过多的本地变量。 有关Android和Java的系统性能分析,Android123将在以后的文章中详细讲述如何调试Java分析内存泄露以及Android上的gdb调试器分析得出内存性能改进。
456. 457. 458.
33. Android中内嵌字体实现个性化
在Android中我们的应用可以灵活的内嵌自己的字体文件,实现各个手机上可以正常的显示个性化文字,我们都知道TextView的setTypeface方法可以设置目标文字的显示特性,比如字体、颜色、粗体、斜体等。我们直接找一个TrueTypeFont的字体文件即.ttf,对于Win32系统的用户可以直接在Windows/fonts文件夹中能找到很多。比如微软雅黑就不错,可是体积太大,由于Android的Assets类有单个文件1MB体积的限制,我们先找个英文字体做测试。这里我们将字体文件android123.ttf放到工程的assets文件夹的fonts目录中。 459.
Typeface tf = Typeface.createFromAsset(getAssets(), \
droid123.ttf\460.
TextView tv = (TextView)findViewById(R.id.text); tv.setT
ypeface(tf); //设置TextView的风格
461. 462.tv.setText(\ tv.setTextSize(12);
463. 464. 465. 466.
tv.setTextColor(Color.RED);
34. 获取和设置ListView的选择项
获取当前选中项 int curPos = listView.getFirstVisiblePosition(); 当然是用getItemAtPosition(int nPos)方法也可以 ,设置当前选择位
置 listView.setSelectedPosition(lastPos); 对于基于AbsListView为基类的ListView等控件均可以使用这种方法。
467. 468. 469.
35. android.text.format文件大小和日期解析类
很多网友可能直接将自己的J2ME项目生硬的移植到Android平台,其实Google为我们提供好了文件大小和时间日期解析类,它位于android.text.format这个包中,它提供了强大的标准化解析方法: 1. IP地址解析类 在android.text.format.Formatter中提供了String formatIpAddress(int addr) 这个方法可以轻松方便的将socket中的int型转成类似127.0.0.1的IP格式,需要注意的是Linux平台的字节顺序,即小字节序、低字节序little-endian。 470.
2. 文件大小解析类 细心的网友可能还看到了
android.text.format.Formatter中的formatFileSize方法,该方法String formatFileSize (Context context, long number) ,第二个参数是long型,一般为File对象的最后修改时间或创建时间的方法,最终返回类似 12KB、5Bytes的值,20MB的字符串。 3. 日期时间解析类 ,该类位于android.text.format.DateFormat这个package中,该类提供了Java中的三种时间对象,Android123提示大家下面三种方法为静态可以直接调用,如下: 471.
final static CharSequence format(CharSequence inFormat, Date
inDate) //传入Date对象
472.Given a format string and a Date object, returns a CharSequence
containing the requested date. final static CharSequence format(CharSequence inFormat, Calendar inDate) //Calendar对象
473.Given a format string and a Calendar object, returns a CharSeque
nce containing the requested date. final static CharSequence format(CharSequence inFormat, long inTimeInMillis) //long对象
474.Given a format string and a time in milliseconds since Jan 1, 1970
GMT, returns a CharSequence containing the requested date. 我们可
能看到了第一个参数均为inFormat这是一个CharSequence接口的String类型,它提供了灵活的时间格式解析字符串描述,Android开发网提示大家注意大小写要区分,如 April 6, 1970 at 3:23am 例子,那么inFormat参数的写法和最终执行的结果如下对照,下面就以Android123的CWJ生日为例子如下 475. 476. 477.
478.
\ \\\
m\479.
\
am\对于判断一个时间是否为24小时制式可以通过android.text.format.DateFormat类的
static boolean is24HourFormat(Context context)方法来判断。
480. 481. 482.
36. Android代码性能优化技巧
目前来说Android 2.2的JIT性能有了本质的提高,不过对于老版本的程序提高Java执行效率还有很多语言特点来说,今天Android123提到的不是语法糖,而是基础的问题,对于Java 1.5之后将会有明显的改进。下面的例子来自SDK: 483. 484. 485. 486. 487.
Foo[] mArray = ... 上面的静态类Foo的执行效果和性能,我们分
三个方法zero、one和two来做对比。 488. 489. 490. 491. 492. 493. 494. 495.
public void zero() { //大多数人可能简单直接这样写 int sum = 0;
for (int i = 0; i < mArray.length; ++i) { sum += mArray.mSplat; } }
public void one() { //通过本地对象改进性能 int sum = 0;
496. 497. 498. 499. 500. 501. 502.
Foo[] localArray = mArray; int len = localArray.length; for (int i = 0; i < len; ++i) { sum += localArray.mSplat; } }
public void two() { //推荐的方法,通过Java 1.5的新语法特性可
以大幅改进性能 503. 504. 505. 506. 507.
int sum = 0;
for (Foo a : mArray) { sum += a.mSplat; }
} zero() is slowest, because the JIT can't yet optimize away the
cost of getting the array length once for every iteration through the loop. one() is faster. It pulls everything out into local variables, avoiding the lookups. Only the array length offers a performance benefit. two() is fastest for devices without a JIT, and indistinguishable from one() for devices with a JIT. It uses the enhanced for loop syntax introduced in version 1.5 of the Java programming language. 508. 509. 510. 511.
37. Android开发注意点 Part One
Android已经的很多细节问题我们通过平台开发总结不断完善这个列表,如果你有相关的内容可以联系
. 一、AssetManager - 已知单个文件处理不能大于1MB,所以如果资源很大,建议使用Zip格式压缩存放。 二、ScrollView中嵌入ListView - 这个作法可能会出现你的ListView仅仅显示1行半。 三、Android自带的Zip处理类对文件名编码无法识别,也没有提供显示的设置方法,在zlib中写死了。 四、使用一些资源对象记住关闭,比如对于文件流对象最后 513. 514. 515.
FileOutputStream os = xxx; try {
//dosomething
} finally {
516. 517.
os.close(); //显示的使用finally关闭文件对象。
} 对于Cursor而言,在移动位置时首先判断Cursor是否为空,最终使用完仍然需要 close方法,如果重用,可以使用deactivate方法释放当前资源,通过requery方法再次查询。 五、SDK中标记为 deprecated 字样的,常规情况下是有更好的方法可以替代,短期内可以放心使用。这些方法一般高版本的SDK都可以向上兼容,目前尚未发现Android放弃某些API的支持。 六、Notification的Intent无法传递到目标的Activity,Service和Broardcast没有测试过,中途需要通过PendingIntent,可能这里出现了问题。
518. 519. 520.
38. Android上HTTP协议通讯状态获取
通常情况下轻量级的Http传输Android平台可以直接使用Sun Java的HttpURLConnection类方法处理,比如果自己定义一次请求header可以通过setRequestProperty设置,而我们需要获取的Http Web Server状态可以通过
HttpURLConnection.getResponseCode() 的方法获取。 当然Http协议返回值常见的有 200 为成功,400为请求错误,404为未找到,500为服务器内部错误,403无权查看,302为重定向等等。 521.
对于Android平台提供更完善的Apache类有HttpClient 、HttpPost、
HttpResponse、HttpGet和HttpEntity,其中对于数据报头header构造通过HttpEntity,而返回状态值可以通过HttpResponse获取。 有关Android客户端和Server通讯类相关的开发我们将会在以后文章中做大量实例介绍。
522. 523. 524.
39. Android布局Java代码构造法
一般情况下对于Android程序布局我们往往使用525. 526. 527. 528.XML文件来编写,这样可以提高开发效率,但是考虑到代码的安全性以及执行效率,可以通过Java代码执行创建,虽然Android编译过的xml是二进制的,但是加载xml解析器的效率对于资源占用还是比较大的,一般一个简单的TextView,比如
android:layout_height=\可以等价于下面的
Java代