Android多线程:预读实现上一篇博文我们可以知道,使用AsyncTask有导致应用FC的风险,而且AsyncTask并不能满
Android多线程:预读实现
上一篇博文我们可以知道,使用AsyncTask有导致应用FC的风险,而且AsyncTask并不能满足我们一些特定的需求。下面我们介绍一种通过模仿AsyncTask的封装方式,实现一个后台预读数据的线程。
描述:在空闲时对获取成本较高的数据(如要读取本地或网络资源)进行预读是提高性能的有效手段。为了给用户带来更好的交互体验,提高响应性,很多网络应用(如新闻阅读类应用)都在启动的时候进行预读,把网络数据缓存到sdcard或者内存中。
下面介绍一个实现预读的例子,打开应用之后会有一个欢迎界面,在打开欢迎界面的同时我们在后台启动预读线程,预读下一个Activity需要显示的数据,预读数据保存到一个静态的Hashmap中。
首先要编写我们的后台预读线程,遵循不重复造轮子的原则,我们对AsyncTask稍作修改就可以满足需求。下面是我们自定义的PreReadTask类代码:
PreReadTask.java 实现预读线程
对比AsyncTask我们实际只修改了一个地方
Data.java 静态的Hashmap保存预读数据
从执行结果可以看到,当进入MainActivity时,listview中的第一屏的图片已经加载好了。
这个简单例子中还不能很好地体现预读带来的用户体验的优势,不过一些应用(如前面提到过的新闻阅读类应用),实现了预读机制,使响应性大大提高,增强了用户体验。
总结:
1、通过实现自定义的AsyncTask来避免AsyncTask引起的FC风险和满足特定的后台异步任务需求
2、实现后台预读可以提高应用的响应性。
3、使用Executors.newSingleThreadExecutor()创建只有一个工作队列的线程池来实现预读需求。
注意:
1、预读队列的工作线程可以不止一个,请根据需求配置自己的线程池。
2、adapter的getview()方法中,我们仍然采用了AsyncTask实现异步获取图片,以后我们将探讨更好的解决办法,在提高响应性的同时,避免了AyncTask带来的FC风险
3、预读也要控制成本,存储空间、耗电和流量都是要考虑的因素。
OK,睡了,明天早上还得早起~~

