Android照片墙应用实现,再多的图片也不怕崩溃(3)

PhotoWallAdapter是整个照片墙程序中最关键的一个类了,这里我来重点给大家讲解一下。首先在PhotoWallAdapter的构造函数中,我们初始化了LruCache类,并设置了最大缓存容量为程序最大可用内存的1/8,接下来又为GridView注册了一个滚动监听器。然后在getView()方法中,我们为每个ImageView设置了一个唯一的Tag,这个Tag的作用是为了后面能够准确地找回这个ImageView,不然异步加载图片会出现乱序的情况。之后调用了setImageView()方法为ImageView设置一张图片,这个方法首先会从LruCache缓存中查找是否已经缓存了这张图片,如果成功找到则将缓存中的图片显示在ImageView上,否则就显示一张默认的空图片。

看了半天,那到底是在哪里下载图片的呢?这是在GridView的滚动监听器中进行的,在onScrollStateChanged()方法中,我们对GridView的滚动状态进行了判断,如果当前GridView是静止的,则调用loadBitmaps()方法去下载图片,如果GridView正在滚动,则取消掉所有下载任务,这样可以保证GridView滚动的流畅性。在loadBitmaps()方法中,我们为屏幕上所有可见的GridView子元素开启了一个线程去执行下载任务,下载成功后将图片存储到LruCache当中,然后通过Tag找到相应的ImageView控件,把下载好的图片显示出来。

由于我们使用了LruCache来缓存图片,所以不需要担心内存溢出的情况,当LruCache中存储图片的总大小达到容量上限的时候,会自动把最近最少使用的图片从缓存中移除。

最后新建或打开MainActivity作为程序的主Activity,代码如下所示:

public class MainActivity extends Activity {

/**
  * 用于展示照片墙的GridView
  */
 private GridView mPhotoWall;

/**
  * GridView的适配器
  */
 private PhotoWallAdapter adapter;

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mPhotoWall = (GridView) findViewById(R.id.photo_wall);
  adapter = new PhotoWallAdapter(this, 0, Images.imageThumbUrls, mPhotoWall);
  mPhotoWall.setAdapter(adapter);
 }

@Override
 protected void onDestroy() {
  super.onDestroy();
  // 退出程序时结束所有的下载任务
  adapter.cancelAllTasks();
 }

}

MainActivity中的代码非常简单,没什么需要说明的了,在Activity被销毁时取消掉了所有的下载任务,避免程序在后台耗费流量。另外由于我们使用了网络功能,别忘了在AndroidManifest.xml中加入网络权限的声明。

现在可以运行一下程序了,效果如下图所示:

可以看到,滚动照片墙,会异步加载图片到相应的ImageView上。随着加载图片的增多,会释放掉一些之前加载过的图片,你多滚动几次就可以看得出了。另外为了能让大家明显看出图片的释放情况,我在这个程序中没有使用本地缓存,所有被释放掉的图片再次显示需要从网络上再下载一遍。在实际的项目中配合适当的本地缓存效果会更好。

打开DDMS,我们可以发现,由于有LruCache帮我们管理图片缓存,不管如何滚动照片墙,程序内存始终会保持在一个合理的范围内。

Android照片墙应用实现,再多的图片也不怕崩溃

本篇文章的重点在于如何对图片进行更好的回收,因此照片墙只是简单地使用GridView进行了展示,想要看更酷更炫的照片墙效果的朋友,可以参考我后面的一篇文章 Android瀑布流照片墙实现,体验不规则排列的美感 。见

好了,今天的讲解到此结束,有疑问的朋友请在下面留言。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f5458f79f93c5965d28c81d5882b09ec.html