`
lixinye0123
  • 浏览: 333176 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

Android高效编程注意事项

阅读更多
原文:http://kuikui.iteye.com/blog/256665

最近用Android开发了几个模块,感觉有点慢,后来好好看了相关优化Android代码的知识,优化之后,感觉快了很多。在这里与大家分享一下,下面只是说的一些很基础有很重要的知识,你想要编写运行速度很快、占用内存少的代码可能有点帮助。

概述

There are two basic rules for resource-constrained systems

Don't do work that you don't need to do.

Don't allocate memory if you can avoid it.

All the tips below follow from these two basic tenets.

知识点

1, Avoid Creating Objects

能不使用包装类就不使用包装类。

尽量使用StringBuffer来处理字符串

尽量使用一维数组代替多维数组

2, Use Native Methods

尽量使用系统提供的接口方法,因为系统提供的接口方法使用C编写的,比自己用Java编写的效率高

3, Prefer Virtual Over Interface

多使用接口的具体实现类。

<1>,Map myMap1 = new HashMap();

<2>,HashMap myMap2 = new HashMap();

两者比较结果:第一种是一向大家比较推崇的,因为他对以后的维护成本低,但是接口方法的调用比实现类方法的调用更耗时。

4, Prefer Static Over Virtual

多使用静态的方法和属性

5, Avoid Internal Getters/Setters

避免使用C++C形式的(i=this.getCounter())这样子的代码

6, Cache Field Lookups

访问对象的属性比访问本地变量花费时间多。

  Accessing object fields is much slower than accessing local variables.

 Instead of writing:

for (int i = 0; i < this.mCount; i++)

     dumpItem(this.mItems[i]);

You should write:

   int count = this.mCount;

   Item[] items = this.mItems;

   for (int i = 0; i < count; i++)

     dumpItems(items[i]);

7, Declare Constants Final

声明一些final类型的常量

static int intVal = 42;

static String strVal = "Hello, world!";

可以写成如下:

static final int intVal = 42;                                                                                           

static final String strVal = "Hello, world!";

 

8, Use Enhanced For Loop Syntax With Caution

谨慎使用增强的for循环,因为它创建多余临时变量。

public class Foo {

   int mSplat;

   static Foo mArray[] = new Foo[27];

 

   public static void zero() {

       int sum = 0;

       for (int i = 0; i < mArray.length; i++) {

           sum += mArray[i].mSplat;

       }

   }

 

   public static void one() {

       int sum = 0;

       Foo[] localArray = mArray;

       int len = localArray.length;

 

       for (int i = 0; i < len; i++) {

           sum += localArray[i].mSplat;

       }

   }

 

   public static void two() {

       int sum = 0;

       for (Foo a: mArray) {

           sum += a.mSplat;

       }

   }

}

zero()返回两次静态字段、每次循环的时候都要请求数组的长度

one()将所有的属性存放到本地,避免查找。

two()使用jdk1.5以上版本的增强for循环,这是有编译器拷贝数组的引用和长度到本地这在主循环体会产生额外的本地装载和存储,这跟one()相比,比其运行时间长一小点,同时也比one()4byte的存储空间u

To summarize all that a bit more clearly: enhanced for loop syntax performs well with arrays, but be cautious when using it with Iterable objects since there is additional object creation.

9, Avoid Enums

避免使用枚举。

10,             Use Package Scope with Inner Classes

建议使用内部类

public class Foo {

   private int mValue;

 

   public void run() {

       Inner in = new Inner();

       mValue = 27;

       in.stuff();

   }

 

   private void doStuff(int value) {

       System.out.println("Value is " + value);

   }

 

   private class Inner {

       void stuff() {

           Foo.this.doStuff(Foo.this.mValue);

       }

   }

}

11,             Avoid Float

尽量避免使用float类型

12,             Some Sample Performance Numbers

一些常用操作的占用时间相对比较:

操作                                                               时间

Add a local variable                                                1

Add a member variable                                                       4

Call String.length()                                                                   5

Call empty static native method                                          5

Call empty static method                                                     12

Call empty virtual method                                                   12.5

Call empty interface method                                             15

Call Iterator:next() on a HashMap                                    165

Call put() on a HashMap                                                         600

Inflate 1 View from XML                                                                22,000

Inflate 1 LinearLayout containing 1 TextView                25,000

Inflate 1 LinearLayout containing 6 View objects         100,000

Inflate 1 LinearLayout containing 6 TextView objects   135,000

Launch an empty activity                                                     3,000,000

 这些时间相对值,值得我们好好的权衡哦,很有帮助。

分享到:
评论

相关推荐

    Android 高效编程注意事项

    ### Android高效编程注意事项 在Android应用开发过程中,为了提高应用程序的性能和响应速度,开发者需要注意以下几点关于高效编程的关键知识点: #### 概述 对于资源受限的系统(如移动设备),有两个基本准则...

    Android环境下Socket编程,服务器端和客户端通讯

    3. **Android特定注意事项**: - Android设备可能在网络状态变化时失去网络连接,因此在进行Socket通信时,需要处理网络中断的情况,并在重新获得连接时恢复通信。 - 由于Android系统的安全限制,网络操作通常应该...

    Android Socket编程实践

    3. **Android特有注意事项**: - **权限设置**:在AndroidManifest.xml中添加`&lt;uses-permission&gt;`标签,如`android.permission.INTERNET`,以允许应用访问网络。 - **网络操作应在子线程中执行**:由于Android的UI...

    Android高级用户界面编程技巧

    #### 五、其他注意事项 - **异步加载图片**: 对于需要显示大量图片的情况,建议使用如Glide或Picasso等第三方库进行异步加载,以避免阻塞主线程导致界面卡顿。 - **限制数据集大小**: 如果列表数据量过大,可以考虑...

    android蓝牙编程教程

    六、注意事项 - 蓝牙操作需要`BLUETOOTH`和`BLUETOOTH_ADMIN`权限。 - 蓝牙连接可能因设备距离、干扰等因素导致不稳定,需做好异常处理。 - 对于BLE设备,Android提供了`BluetoothGatt`类进行更精细的控制。 以上...

    Android Socket网络编程原理.pdf

    本文主要讨论了Android Socket网络编程的一些关键概念和注意事项,特别是针对Android平台的特殊性。 首先,Android上的Socket编程大多用于客户端应用。由于手机设备通常不具备固定IP地址,而是由移动运营商动态分配...

    android系统JNI编程详解

    本文将深入解析Android系统中的JNI编程,包括其基本概念、开发步骤、注意事项以及实际应用。 1. JNI基本概念 JNI是Java平台提供的一种接口,它定义了一套标准的函数调用规范,使得Java代码可以调用C/C++编写的功能...

    184个Android开发常见问题、实用技巧及注意事项

    这份资料“184个Android开发常见问题、实用技巧及注意事项”正是为了帮助开发者解决这些问题而准备的。以下是部分可能涵盖的知识点: 1. **Activity生命周期**:理解Activity的创建、启动、暂停、恢复和销毁过程,...

    Android视频采集+RTSP完整代码(可用)

    6. **注意事项**: - **兼容性**:不同Android版本和设备间的Camera API和硬件差异可能会影响代码兼容性,需要进行适配。 - **性能优化**:视频采集和传输需要考虑性能和功耗,例如合理设置帧率和分辨率,避免过度...

    Android C++高级编程:使用NDK 中文完整版

    还详细讨论了JNI的开发流程和注意事项。 3. **C++在Android中的应用**:探讨C++在Android中的优势,如性能优化、多线程编程、内存管理以及C++11及更高版本的新特性在Android上的应用。 4. **库的创建与使用**:...

    基于Android的Socket服务器编程.pdf

    4. 注意事项 在基于Android的Socket编程中,务必使用多线程处理客户端连接,以提高程序效率。此外,为了确保网络连接的稳定,需要定期发送心跳包,以便检测对方是否在线。在网络突然断开时,心跳包能帮助发现异常并...

    android-ndk(android-ndk-r25b-windows.zip)

    **使用Android NDK的优点与注意事项:** - **优点:** - 性能提升:原生代码通常比Java更快,尤其是在处理密集型计算时。 - 代码复用:可以利用已有的C/C++库。 - 资源优化:通过静态链接,可以减少APK的大小。 ...

    Android开发工具下载网址

    - **注意事项**:由于Android SDK的持续迭代更新,开发者在选择版本时应考虑到应用目标设备的兼容性问题。当前Android开发强烈建议使用最新版本的Android SDK,以利用最新的API特性、安全增强和性能优化。 ### 结语...

    eclipse for php and android

    7. **注意事项**:尽管Eclipse为PHP和Android开发提供了便利,但随着技术的发展,Google已经推荐开发者使用更现代的Android Studio进行Android开发,因为它拥有更全面的Android特性和更高效的集成开发环境。...

    Android studio结课大作业

    这有助于开发者理解应用发布时需要注意的事项,以及如何调试和优化已打包的应用。 再者,**实训报告**通常包含了项目开发的全过程记录,包括需求分析、设计思路、遇到的问题及解决方案等。通过阅读实训报告,我们能...

    arm-linux-androideabi-4.9.7z

    六、注意事项 1. **ABI兼容性**:确保编译的目标ABI(Application Binary Interface)与目标设备的ABI匹配,否则可能导致运行时错误。 2. **Android.mk文件**:在构建过程中,通常需要一个Android.mk文件来指定...

    AndroidResEdit.zip

    三、使用AndroidResEdit的注意事项 1. 版本兼容:在使用AndroidResEdit时,需要确保软件版本与处理的APK文件所对应的Android版本相匹配,以避免可能出现的兼容性问题。 2. 数据备份:在修改APK前,建议先备份原始...

    android ndk下编译的live555源码(新版)

    **注意事项:** 1. **兼容性**:确保编译的目标库与Android版本和设备架构相匹配,如armeabi、armeabi-v7a、arm64-v8a等。 2. **权限问题**:在AndroidManifest.xml中添加必要的权限,如INTERNET权限,以便进行网络...

    Android离线API

    5. **使用离线API**:开发者可以通过搜索功能快速定位到需要的API,了解其功能、用法和注意事项。此外,离线文档通常也支持书签和历史记录功能,便于开发者管理常用或最近查看的API。 6. **Android SDK**:Android ...

    《Android应用开发揭秘》附带光盘代码.

     14.3.2 游戏引擎设计注意事项  14.4 游戏引擎实现  14.4.1 Activity类实现  14.4.2 流程控制和线程  14.4.3 游戏对象与对象管理  14.4.4 图形引擎  14.4.5 物理引擎  14.4.6 事件模块  14.4.7 工具模块  ...

Global site tag (gtag.js) - Google Analytics