引导
在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);