Android优化系列——性能优化(资源存储)

文件资源(raw/data/asset)的存取

  • 私有文件下的文件存取(/data/data/包名)
public void weiteFileData(String fileName, String message){
    try{
        FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);
        byte[] bytes = message.getBytes();
        fout.write(bytes);
        fout.close();
    }catch(Exception e){
        e.ptintStackTrace();
    }
}

public String readFileData(String fileName){
    String res = "";
    try{
        FileInputStrem fin = openFileInput(fileName);
        int length = fin.available();
        byte[] buffer = new byte[lenght];
        fin.read(buffer);
        res = EncodingUtils.getString(buffer, "UTF-8");
        fin.close();
    }catch(Exception e){
        e.ptintStackTrace();
    }
    return res;
}
  • 从raw读取资源(这里的资源文件只能读不能写)
public String getFromRaw(String fileName){
    String res = "";
    try{
        InputStream in = getResources().openRawResource(R.raw.test1);
        int length = in.available();
        byte[] buffer = new byte[length];
        in.read(buffer);
        res = EncodingUtils.getString(buffer, "UTF-8");
        in.close();
    }catch(Exception e){
        e.ptintStackTrace();
    }
    return res;
}
  • 从asset读取资源(这里的资源文件只能读不能写)
public String getFromAsset(String fileName){
    String res = "";
    try{
        InputStream in = getResources().getAssets().open(fileName);
        int length = in.available();
        byte[] buffer = new byte[length];
        in.read(buffer);
        res = EncodingUtils.getString(buffer, "UTF-8");
        in.close();
    }catch(Exception e){
        e.ptintStackTrace();
    }
    return res;
}

Android对Drawable对象的优化

Android本身就对Drawable进行了优化,例如,当每次创建一个按钮时,一个新的Drawable就会被装载,这就意味着应用程序中所有使用不同Drawable对象实现不同的背景的按钮,所有的Drawable对象公用一个公用的状态,称之为“constant state(常态)”。如此一来,一个按钮将共享一张位图,节省了资源。

这里写图片描述

Drawable star = context.getResources().getDrawable(R.drawable.star);
if(book.isFavorite()){
    star.setAlpha(255);
}else{
    star.setAlpha(70);
}

以上代码运行后,你会发现即使判断了isFavorite后,使用同一资源的两张图的透明度都是一样的,这是因为它们拥有同样的“constant state”,所以透明值这个属性常量是一样的。
Drawable对象下,我们可以利用mutate()方法处理这个问题,使这个对象不会因为复制而影响其他对象。但是在Bitmap对象下,mutate()方法无法解决这个问题。

Drawable star = context.getResources().getDrawable(R.drawable.star);
if(book.isFavorite()){
    star.mutate().setAlpha(255);
}else{
    star.mutate().setAlpha(70);
}

这里写图片描述

建议使用Drawable,而不是Bitmap

使用Drawable保存图片对象,占用更小的内存空间,而使用Bitmap对象,则会占用很大的内存空间。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值