Android优化系列——代码优化

来源:互联网 发布:gta5ol女性捏脸数据 编辑:程序博客网 时间:2024/06/06 17:04

避免建立对象

  • 代码流程优化
    在if语句中判断是否创建对象
  • 对象声明技巧
    在使用Vector时,建议初始化时声明其大小
Vector v = new Vector(40);//orVector 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
原创粉丝点击