TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
一、ImageRequest
StringRequest和JsonRequest都是继承Request的,ImageRequest也是继承Request的,因此他们的用法基本相同,也是按照以下三步进行操作:
1.创建一个RequestQueue对象
2.创建Request对象
3.将Request对象添加到RequestQueue队列里
- <span style="font-size:14px;">private void Vollry_GetImage() {
- //第一个参数:图片Url
- //第二个参数:成功回调,Bitmap类型
- /*
- 第三、第四个参数:指定允许图片最大的宽度和高度
- 如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,
- 如果指定成0的话就表示不管图片有多大,都不会进行压缩。
- */
- /*
- 第五个参数用于指定图片的颜色属性
- Bitmap.Config下的几个常量都可以在这里使用,
- ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,
- RGB_565则表示每个图片像素占据2个字节大小。
- */
- //第六个参数:出错回调,显示提示图片
- String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
- ImageRequest imageRequest = new ImageRequest(
- imgUrl,
- new Response.Listener<Bitmap>() {
- @Override
- public void onResponse(Bitmap response) {
- imageView.setImageBitmap(response);
- }
- },
- 0,
- 0,
- Bitmap.Config.RGB_565,
- new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- imageView.setImageResource(R.mipmap.ic_launcher);
- }
- });
- MyApplication.getHttpQueues().add(imageRequest);
- }</span>
复制代码 二、
ImageLoader
ImageLoader也可以用于加载网络图片,它的内部是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader不是继承自Request的,所以它的用法也和之前的内容有所不同,大致可以分为四步:
1.创建RequestQueue对象
2.创建ImageLoder对象
3.获取ImageListener对象
4.调用ImageLoder的get方法加载网络图片
- private void Vollry_GetImageLoader() {
- String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
- //可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求.
- //第一个参数:RequestQueue对象
- //第二个参数:ImageCache对象
- ImageLoader imageLoader = new ImageLoader(
- MyApplication.getHttpQueues(),
- new BitmapCache()
- );
- // 第一个参数:用于显示图片的ImageView控件,
- // 第二个参数:加载图片过程显示的图片,
- // 第三个参数:加载图片失败显示的图片。
- ImageLoader.ImageListener listener = ImageLoader.getImageListener(
- imageView,
- R.mipmap.ic_launcher,
- R.mipmap.ic_launcher
- );
- //第一个参数:图片的URL地址,
- //第二个参数:获取到的ImageListener对象listener。
- //第三个、四个参数是图片的最大宽度、高度
- //imageLoader.get(imgUrl, listener);
- imageLoader.get(imgUrl, listener, 500, 350);
- }
复制代码 这里我们新建一个BitmapCache并实现了ImageCache接口来缓存图片,用到了Android提供的LruCache功能
- /** Lru即Least Recently Used近期最少使用算法* LruCache是基于Lru算法实现的一种缓存机制* Lru算法原理是当内存缓存数据大于设定的最大值时,把近期最少使用的数据移除,有效避免OOM。* LruCache没有真正是释放内存,知识从Map中移除数据,真正释放内存还要用户手动释放** */public class BitmapCache implements ImageLoader.ImageCache { final int memoryCache = MyApplication.getMemoryCacheSize(); //Url,图片 private LruCache<String, Bitmap> myCache; public BitmapCache() { //通过构造方法初始化缓存最大值,KB为单位 myCache = new LruCache<String, Bitmap>(memoryCache) { //重写sizeOf方法衡量每张图片大小,默认返回的是图片数量 @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; } @Override public Bitmap getBitmap(String s) { return myCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { myCache.put(s, bitmap); }}
复制代码
这里,final int memoryCache = MyApplication.getMemoryCacheSize();在MyApplication类添加了下面方法:
- <span style="font-size:14px;">public static int getMemoryCacheSize() {
- //为了全局调用,在Application类中定义了cache大小的方法,官方建议取当前app可用内存的1/8。
- final int memClass = (int) (Runtime.getRuntime().maxMemory())/1024;
- return memClass / 8;
- }</span>
复制代码
三、
NetworkImageView
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并在原生的基础之上添加加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
1.创建RequestQueue对象
2.创建一个ImageLoder对象
3. 在xml布局文件中添加NetworkImageView控件,在java代码中获取该控件的实例。
4. 设置要加载的图片地址和属性。
- <span style="font-size:14px;">public class Demo_NetworkImageView extends AppCompatActivity {
- private NetworkImageView networkImageView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.demo_network_image_view);
- networkImageView = (NetworkImageView) findViewById(R.id.Volley_NetworkImageView);
- Vollry_NetworkImageView();
- }
- private void Vollry_NetworkImageView() {
- String imgUrl="http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
- ImageLoader imageLoader = new ImageLoader(
- MyApplication.getHttpQueues(),
- new BitmapCache()
- );
- networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
- networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
- networkImageView.setImageUrl(
- imgUrl,
- imageLoader
- );
- }
- }
- </span>
复制代码
|
|