欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android的多媒体管理库Glide的基本使用示例

程序员文章站 2024-03-01 23:27:10
glide 是一个android平台上的快速和高效的开源的多媒体资源管理库, 提供 多媒体文件的压缩,内存和磁盘缓存, 资源池的接口。 glide 支持获取,解压展示视频...

glide 是一个android平台上的快速和高效的开源的多媒体资源管理库, 提供 多媒体文件的压缩,内存和磁盘缓存, 资源池的接口。
glide 支持获取,解压展示视频, 图像和gifs,  glide有一个可弹性的api可以让开发者自定义网络栈技术, 默认使用httpurlconnection , 你可以替换为  google's volley或者 okhttp

glide 开始的目的是提供一个快速和平滑展示图片列表, 但是glide对你需要拉取, resize 和展示远程的图片这些场景都是很管用的.

glide最简单的使用案例就是从远程服务器或者本地文件系统加载图片,把它们放在磁盘与内存缓存中,然后加载到view上。它可以用在全市图片的app中,glide为包含图片的滚动列表做了尽可能流畅的优化。

对象池
glide原理的核心是为bitmap维护一个对象池。对象池的主要目的是通过减少大对象的分配以重用来提高性能。

dalvik和art虚拟机都没有使用compacting garbage collector,compacting garbage collector是一种模式,这种模式中gc会遍历堆,同时把活跃对象移到相邻内存区域,让更大的内存块可以用在后续的分配中。因为安卓没有这种模式,就可能会出现被分配的对象分散在各处,对象之间只有很小的内存可用。如果应用试图分配一个大于邻近的闲置内存块空间的对象,就会导致outofmemoryerror,然后崩溃,即使总的空余内存空间大于对象的大小。

使用对象池还可以帮助提高滚动的性能,因为重用bitmap意味着更少的对象被创建与回收。垃圾回收会导致“停止一切(stop the world)”事件,这个事件指的是回收器执行期间,所有线程(包括ui线程)都会暂停。这个时候,图像帧无法被渲染同时ui可能会停滞,这在滚动期间尤其明显。

Android的多媒体管理库Glide的基本使用示例

下载
glide的github项目地址 https://github.com/bumptech/glide

可以在github上下载 release page.

或者使用gradle:

repositories {
 mavencentral()
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.3.+'
  compile 'com.android.support:support-v4:19.1.0'
}

repositories {
 mavencentral()
}
 
dependencies {
  compile 'com.github.bumptech.glide:glide:3.3.+'
  compile 'com.android.support:support-v4:19.1.0'
}

maven

<dependency>
 <groupid>com.github.bumptech.glide</groupid>
 <artifactid>glide</artifactid>
 <version>3.3.1</version>
 <type>aar</type>
</dependency>
<dependency>
 <groupid>com.google.android</groupid>
 <artifactid>support-v4</artifactid>
 <version>r7</version>
</dependency>

<dependency>
 <groupid>com.github.bumptech.glide</groupid>
 <artifactid>glide</artifactid>
 <version>3.3.1</version>
 <type>aar</type>
</dependency>
<dependency>
 <groupid>com.google.android</groupid>
 <artifactid>support-v4</artifactid>
 <version>r7</version>
</dependency>

使用

glide使用起来很简单,而且不需要任何特别的配置就自动包含了bitmap pooling 。

drawablerequestbuilder requestbuilder = glide.with(context).load(imageurl);
requestbuilder.into(imageview);

这就是加载一张图片的全部要求。就像安卓中的很多地方一样,with() 方法中的context到底是哪种类型是不清楚的。有一点很重要需要记住,就是传入的context类型影响到glide加载图片的优化程度,glide可以监视activity的生命周期,在activity销毁的时候自动取消等待中的请求。但是如果你使用application context,你就失去了这种优化效果。

注:其实以上的代码是一种比较规范的写法,我们更熟悉的写法是:

glide.with(context)
  .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
  .into(ivimg);

简单的例子

// for a simple view:
@override
public void oncreate(bundle savedinstancestate) {
  ...

  imageview imageview = (imageview) findviewbyid(r.id.my_image_view);

  glide.with(this).load("http://goo.gl/h8qoq7").into(imageview);
}

// for a list:
@override
public view getview(int position, view recycled, viewgroup container) {
  final imageview myimageview;
  if (recycled == null) {
    myimageview = (imageview) inflater.inflate(r.layout.my_image_view,
        container, false);
  } else {
    myimageview = (imageview) recycled;
  }

  string url = myurls.get(position);

  glide.with(myfragment)
    .load(url)
    .centercrop()
    .placeholder(r.drawable.loading_spinner)
    .crossfade()
    .into(myimageview);

  return myimageview;
}

// for a simple view:
@override
public void oncreate(bundle savedinstancestate) {
  ...
 
  imageview imageview = (imageview) findviewbyid(r.id.my_image_view);
 
  glide.with(this).load("http://goo.gl/h8qoq7").into(imageview);
}
 
// for a list:
@override
public view getview(int position, view recycled, viewgroup container) {
  final imageview myimageview;
  if (recycled == null) {
    myimageview = (imageview) inflater.inflate(r.layout.my_image_view,
        container, false);
  } else {
    myimageview = (imageview) recycled;
  }
 
  string url = myurls.get(position);
 
  glide.with(myfragment)
    .load(url)
    .centercrop()
    .placeholder(r.drawable.loading_spinner)
    .crossfade()
    .into(myimageview);
 
  return myimageview;
}

volley

如果你想使用volley:

gradle

dependencies {
  compile 'com.github.bumptech.glide:volley-integration:1.0.+'
  compile 'com.mcxiaoke.volley:library:1.0.+'
}

dependencies {
  compile 'com.github.bumptech.glide:volley-integration:1.0.+'
  compile 'com.mcxiaoke.volley:library:1.0.+'
}

maven:

<dependency>
  <groupid>com.github.bumptech.glide</groupid>
  <artifactid>volley-integration</artifactid>
  <version>1.0.1</version>
  <type>jar</type>
</dependency>
<dependency>
  <groupid>com.mcxiaoke.volley</groupid>
  <artifactid>library</artifactid>
  <version>1.0.5</version>
  <type>aar</type>
</dependency>

<dependency>
  <groupid>com.github.bumptech.glide</groupid>
  <artifactid>volley-integration</artifactid>
  <version>1.0.1</version>
  <type>jar</type>
</dependency>
<dependency>
  <groupid>com.mcxiaoke.volley</groupid>
  <artifactid>library</artifactid>
  <version>1.0.5</version>
  <type>aar</type>
</dependency>

然后在你的activity或者程序中,注册volley为基本模块

public void oncreate() {
 glide.get(this).register(glideurl.class, inputstream.class,
    new volleyurlloader.factory(yourrequestqueue));
 ...
}

public void oncreate() {
 glide.get(this).register(glideurl.class, inputstream.class,
    new volleyurlloader.factory(yourrequestqueue));
 ...
}

okhttp

gradle:

dependencies {
  compile 'com.github.bumptech.glide:okhttp-integration:1.0.+'
  compile 'com.squareup.okhttp:okhttp:2.0.+'
}

dependencies {
  compile 'com.github.bumptech.glide:okhttp-integration:1.0.+'
  compile 'com.squareup.okhttp:okhttp:2.0.+'
}

maven:

<dependency>
  <groupid>com.github.bumptech.glide</groupid>
  <artifactid>okhttp-integration</artifactid>
  <version>1.0.1</version>
  <type>jar</type>
</dependency>
<dependency>
  <groupid>com.squareup.okhttp</groupid>
  <artifactid>okhttp</artifactid>
  <version>2.0.0</version>
  <type>jar</type>
</dependency>

<dependency>
  <groupid>com.github.bumptech.glide</groupid>
  <artifactid>okhttp-integration</artifactid>
  <version>1.0.1</version>
  <type>jar</type>
</dependency>
<dependency>
  <groupid>com.squareup.okhttp</groupid>
  <artifactid>okhttp</artifactid>
  <version>2.0.0</version>
  <type>jar</type>
</dependency>
 

然后在你的activity或者程序中,注册volley为基本模块

public void oncreate() {
 glide.get(this).register(glideurl.class, inputstream.class,
    new okhttpurlloader.factory(yourokhttpclient));
 ...
}

public void oncreate() {
 glide.get(this).register(glideurl.class, inputstream.class,
    new okhttpurlloader.factory(yourokhttpclient));
 ...
}