Android优化系列——代码优化

避免建立对象

  • 代码流程优化
    在if语句中判断是否创建对象
  • 对象声明技巧
    在使用Vector时,建议初始化时声明其大小
Vector v = new Vector(40);
//or
Vector v = new Vector(40,25);
  • 不要多次声明对象
    建议这样的写法:
public class x{
    private Vector v;
    public x(){
        v = new Vector();
    }
}

我们应该尽量避免创建短期的临时对象,越少的对象创建意味着越少的垃圾回收。

优化方法调用

  • 使用自身方法,如String.indexOf()
  • 使用虚拟优于使用接口
  • 使用静态优于使用虚拟
    静态方法会被更快的调用,因为它不需要一个虚拟函数导向表。
  • 避免使用内在的get,set方法
    内部变量可以自己调用,可以不需要通过这两个方法调用
  • 建议使用getBytes()
  • 避免使用InetAddress.getHostAddress()
    它会生成许多中间字符串来返回主机地址
  • 避免使用DategramPacket.getSocketAddress()

优化代码变量

  • StringBuffer的使用
    当需要连接String时,不要这样操作:
String str = "welcome"+"to"+"shenzhen";

应当写成:

StringButter sb = new StringButter(50);
sb.append("welcome");
sb.append("to");
sb.append("shenzhen");
  • 声明Final常量
  • 避免使用列举类型
public class Foo{
    public enum Shrubbery{
        GROUND,CRAWLING,HANGING
    }
}

上述代码会转变成一个900字节的class文件(Foo$Shrubbery.class)。当第一次使用时,类的初始化要调用方法去描述列举的每一项,每一个对象都要有它自身的静态空间,整个被储存在一个数组里(一个叫$VALUE的静态数组)。

  • 避免使用枚举
  • 在访问内部类时,可以将内部类访问的变量和函数声明由私有改为包范围。

优化代码过程

  • 慎重使用增强型for循环语句
    增强型for循环就是”for-each循环“,特别是和Iterable一起使用时。
  • 通过内联类使用包空间
  • 避免浮点类型的使用
  • 避免在条件判断语句中重复调用函数*
    这个是重点,错误演示:
for(int i=0;i<s.length;i++){
    char c = s.charAt(i);
}

正确形式:

int j = str.length();
for(int i=0;i<j;i++){
    char c = s.charAt(i);
}

提高Cursor查询性能

while(cursor.moveToNext){
    String name = cursor.getString(cursor.getColumnIndex(People.Name));
    String phoneNo = cursor.getString(cursor.getColumnIndex(People.Number));
}

上述代码在查询量一多的时候,运行速度会相当慢。

int nameIndex = cursor.getColumnIndex(People.Name);
int numberIndex = cursor.getColumnIndex(People.Number);
while(cursor.moveToNaxt){
    String name = cursor.getString(nameIndex);
    String phoneNo = cursor.getString(numberIndex);
}

这样经过改造后,查询时运行速度明显提升了。

使用ContentProvider共享数据

可以通过ContentProvider来封装数据的query查询,添加insert,删除delete和更新update,而无须用复杂的SQLite。提高了程序运行效率。

public class NotePadProvider extends ContentProvider{
    ...
    private static class DatabaseHelper extends SQLiteOpenHelper{
    DatebaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @override
    public void onCteate(SQLiteDatabase db){
        db.execSQL(...);
    }
    ...
    }
    private DatabaseHelper mOpenHelper;
    @override
    public boolean onCreate(){
        mOpenHelper = new DatabaseHelper(getContext());
        return true;
    }
    @override
    public Cursor query(Uri uri, String projection, String selection, String[] selectionArgs, String sortOrder){
    ...
    SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
    }
}

要想开发出高效的ContentProvider存储应用,就要尽可能的减少SQL语句的编写在外部操作,封装成方法,这样有关SQL语言的执行在DatabaseHelper中也被简化和分离出来了,而SQL语句主要是体现在选择表的字段,where这样的条件限定语句,这大大减少了我们日常开发工作量,从而优化了工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值