Android系统源码分析-bitmap的加载

本文通过分析Android系统源码,详细探讨Bitmap类的加载过程,包括Bitmap.java的构造函数、BitmapFactory.java的静态方法、BitmapFactory.cpp的native方法,特别是doDecode()核心方法的解析,以及内存管理的重要性。通过阅读源码,帮助开发者理解Android中图片加载的工作流程,以解决Bitmap加载相关问题。
摘要由CSDN通过智能技术生成

引导

在Android的开发中,有图片是非常常见的了,但是对于图片的加载 处理遇到问题也是经常出现的,对于开发者而言,加载图片的时候产生OOM,应该都有出现过吧.本文,通过阅读bitmap源码的方式,熟悉Android中图片的加载工作流程,以便能从工作流程上去解决一些bitmap加载的问题.

1.Bitmap.java阅读

bitmap是Android里面的图片对象类,Android开发中,接触bitmap是必不可少的.java的代码阅读的话,首先肯定是构造函数,那么看一下bitmap的构造函数:

Bitmap(String name, int width, int height, Bitmap.NativeWrapper nativeData) {
    mName = name;
    mWidth = width;
    mHeight = height;
    mNativeWrapper = nativeData;
}

可以看到,bitmap的构造函数是默认的访问权限,即外部不可以访问.那么我们要怎么样去得到一个bitmap的对象呢?

常规来说,java类的对象获得一般步骤如下:

a) new一个对象,及调用构造方法
b) getInstance()类似的静态方法,方法内部调用了构造函数
c) 工厂类调用工厂方法

但是,在bitmap类中,并没有静态的获得对象的方法,所以我们只能把希望寄托在工厂类了.

2.BitmapFactory.java阅读

BitmapFactory中,有提供一些静态的方法去获得一个bitmap对象,主要方法如下:
主要有五对方法:
a) 从文件加载

public static Bitmap decodeFile(String pathName){}
public static Bitmap decodeFile(String pathName, Options opts){}

b) 从资源文件加载

public static Bitmap decodeResource(Resources res, int id){}
public static Bitmap decodeResource(Resources res, int id, Options opts) {}

c) 从二进制数组加载

public static Bitmap decodeByteArray(byte[] data, int offset, int length){}
public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) {}

d) 从流加载

public static Bitmap decodeStream(InputStream is) {}
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {}

f) 从文件描述符加载

public static Bitmap decodeFileDescriptor(FileDescriptor fd) {}
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {}

上述五对方法,都会有相对应一组中参数少的一个调用参数多的一个方法,最后转到调用几个native的方法:

a) private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage,Rect padding, Options opts);
b) private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,Rect padding, Options opts);
c) private static native Bitmap nativeDecodeAsset(long nativeAsset, Rect padding, Options opts);
d) private static native Bitmap nat
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值