Android編程使用緩存優(yōu)化ListView的方法
本文實例講述了Android編程使用緩存優(yōu)化ListView的方法。分享給大家供大家參考,具體如下:
ListView調(diào)用Adapter的getView方法獲取每一個Item布局,將這些已經(jīng)獲得的Item布局放入緩存,將大大提高獲取數(shù)據(jù)的效率,而且節(jié)省更多的流量,將數(shù)據(jù)進行緩存有兩種方法是,一種是將內(nèi)存緩存一種是sd卡緩存,在此分別進行演示。
sd卡緩存:
sd卡緩存是將下載的數(shù)據(jù)保存到sd卡中,當再次要獲取數(shù)據(jù)時,首先要判斷sd卡中是否存在,如果存在的話,就直接讀取sd卡中的數(shù)據(jù),如果不存在就從網(wǎng)上下載,然后保存到sd卡中
內(nèi)存緩存:
內(nèi)存優(yōu)化是將獲取到的數(shù)據(jù)存取到Map集合中,如果再次引用此數(shù)據(jù),就直接從Map集合中獲取,這樣會導致一個問題,如果Map集合中的數(shù)據(jù)特別多,比如存取了100萬條數(shù)據(jù),這樣有可能就會導致內(nèi)存溢出。這是因為Map集合是強引用的集合,如何不把Map集合置為空的話,這個集合Java虛擬機就不會把它回收掉,當Map中的數(shù)據(jù)大小超過了內(nèi)存大小就會導致內(nèi)存溢出。為了避免這種異常我們要使用軟引用softreference ,軟引用和強引用的區(qū)別如下:
1. softreference 他是java虛擬機給我們提供的一個包裝類型.
在包裝類型里面的對象 一般情況下 ,java虛擬機會盡量長時間的保留這個對象
當java虛擬機內(nèi)存不足的時候 java虛擬機就會回收 softreference里面的對象
2. hardreference 默認new出來的對象 都是這種強應用的類型
只要一個對象還保留的有引用,他就不會被垃圾回收
Map<String,Bitmap> map;
核心代碼:
sd卡緩存
public class MyReadAdapter extends BaseAdapter{
private List<CollectionEntry> entrys;
public MyReadAdapter(CollectionFeed feeds) {
entrys = feeds.getEntries();
}
public int getCount() {
return entrys.size();
}
public Object getItem(int position) {
return entrys.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = infalter.inflate(R.layout.myread_item, null);
final ImageView iv = (ImageView) view.findViewById(R.id.book_img);
//獲取數(shù)據(jù)實體
CollectionEntry ce = entrys.get(position);
//獲取圖片地址
String iconurl = ce.getSubjectEntry().getLink("image", null).getHref();
int start = iconurl.lastIndexOf("/");
int end = iconurl.length();
final String iconname = iconurl.substring(start, end);
//Environment.getExternalStorageDirectory()這個是sd卡目錄
File file = new File(Environment.getExternalStorageDirectory(),iconname);
//獲取sd卡緩存
if(file.exists()){
iv.setImageURI(Uri.fromFile(file));
Log.i(TAG,"使用sd卡圖片");
}else{
new LoadImageAsynTask(new ImageTaskCallback() {
// 圖片獲取之后
public void onImageLoaded(Bitmap bitmap) {
if(bitmap!=null){
iv.setImageBitmap(bitmap);
//把圖片存到sd卡上
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
try {
File file = new File(Environment.getExternalStorageDirectory(),iconname);
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
}
}
}else{
iv.setImageResource(R.drawable.book);
}
}
//圖片獲取之前
public void beforeImageLoaded() {
iv.setImageResource(R.drawable.book);
}
}).execute(iconurl);
}
return view;
}
}
內(nèi)存緩存
Map<String,SoftReference<Bitmap>> map;
public class MyReadAdapter extends BaseAdapter{
private List<CollectionEntry> entrys;
public MyReadAdapter(CollectionFeed feeds) {
entrys = feeds.getEntries();
}
public int getCount() {
return entrys.size();
}
public Object getItem(int position) {
return entrys.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = infalter.inflate(R.layout.myread_item, null);
final ImageView iv = (ImageView) view.findViewById(R.id.book_img);
//獲取到數(shù)據(jù)的實體
CollectionEntry ce = entrys.get(position);
//獲取到圖片的Url
String iconurl = ce.getSubjectEntry().getLink("image", null).getHref();
int start = iconurl.lastIndexOf("/");
int end = iconurl.length();
final String iconname = iconurl.substring(start, end);
//使用內(nèi)存緩存
if(map!=null && map.get(iconname)!=null){
iv.setImageBitmap(map.get(iconname).get());
Log.i(TAG,"使用內(nèi)存緩存");
}
else{
new LoadImageAsynTask(new ImageTaskCallback() {
// 圖片獲取之后
public void onImageLoaded(Bitmap bitmap) {
if(bitmap!=null){
iv.setImageBitmap(bitmap);
//存放到內(nèi)存中,
//軟引用類型的bitmap
map.put(iconname, new SoftReference<Bitmap>(bitmap));
}else{
iv.setImageResource(R.drawable.book);
}
}
//圖片獲取之前
public void beforeImageLoaded() {
iv.setImageResource(R.drawable.book);
}
}).execute(iconurl);
}
return view;
}
}
希望本文所述對大家Android程序設計有所幫助。
相關文章
解決Android TabLayout 在寬屏幕上tab不能平均分配的問題
這篇文章主要介紹了解決Android TabLayout 在寬屏幕上tab不能平均分配的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android編程開發(fā)ScrollView中ViewPager無法正?;瑒訂栴}解決方法
這篇文章主要介紹了Android編程開發(fā)ScrollView中ViewPager無法正?;瑒訂栴}解決方法,以實例形式分析了ScrollView中滑動失效的原因及解決方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
flutter實現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解
這篇文章主要為大家介紹了flutter實現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

