欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程使用緩存優(yōu)化ListView的方法

 更新時間:2015年12月30日 10:03:34   作者:傅榮康  
這篇文章主要介紹了Android編程使用緩存優(yōu)化ListView的方法,涉及ListView針對sd卡緩存及內(nèi)存緩存的優(yōu)化技巧,需要的朋友可以參考下

本文實例講述了Android編程使用緩存優(yōu)化ListView的方法。分享給大家供大家參考,具體如下:

ListView調(diào)用Adapter的getView方法獲取每一個Item布局,將這些已經(jīng)獲得的Item布局放入緩存,將大大提高獲取數(shù)據(jù)的效率,而且節(jié)省更多的流量,將數(shù)據(jù)進(jìn)行緩存有兩種方法是,一種是將內(nèi)存緩存一種是sd卡緩存,在此分別進(jìn)行演示。

sd卡緩存:

sd卡緩存是將下載的數(shù)據(jù)保存到sd卡中,當(dāng)再次要獲取數(shù)據(jù)時,首先要判斷sd卡中是否存在,如果存在的話,就直接讀取sd卡中的數(shù)據(jù),如果不存在就從網(wǎng)上下載,然后保存到sd卡中

內(nèi)存緩存:

內(nèi)存優(yōu)化是將獲取到的數(shù)據(jù)存取到Map集合中,如果再次引用此數(shù)據(jù),就直接從Map集合中獲取,這樣會導(dǎo)致一個問題,如果Map集合中的數(shù)據(jù)特別多,比如存取了100萬條數(shù)據(jù),這樣有可能就會導(dǎo)致內(nèi)存溢出。這是因為Map集合是強(qiáng)引用的集合,如何不把Map集合置為空的話,這個集合Java虛擬機(jī)就不會把它回收掉,當(dāng)Map中的數(shù)據(jù)大小超過了內(nèi)存大小就會導(dǎo)致內(nèi)存溢出。為了避免這種異常我們要使用軟引用softreference ,軟引用和強(qiáng)引用的區(qū)別如下:

1. softreference 他是java虛擬機(jī)給我們提供的一個包裝類型.

在包裝類型里面的對象 一般情況下 ,java虛擬機(jī)會盡量長時間的保留這個對象
當(dāng)java虛擬機(jī)內(nèi)存不足的時候 java虛擬機(jī)就會回收 softreference里面的對象

2. hardreference 默認(rèn)new出來的對象 都是這種強(qiáng)應(yīng)用的類型

只要一個對象還保留的有引用,他就不會被垃圾回收

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程序設(shè)計有所幫助。

相關(guān)文章

  • Android實現(xiàn)圖片九宮格

    Android實現(xiàn)圖片九宮格

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)圖片九宮格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Android RenderScript高斯模糊

    Android RenderScript高斯模糊

    這篇文章主要介紹了Android RenderScript高斯模糊的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • android實現(xiàn)加載動畫對話框

    android實現(xiàn)加載動畫對話框

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)加載動畫對話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • popupwindow焦點問題解決方案

    popupwindow焦點問題解決方案

    在android 開發(fā)過程中,總會遇到一些問題,比如popupwindow焦點問題等等,我們該如何解決呢?需要的朋友可以了解下
    2012-11-11
  • Android開發(fā)人臉識別登錄功能

    Android開發(fā)人臉識別登錄功能

    這篇文章主要介紹了Android開發(fā)人臉識別登錄功能,這個很多公司都在使用,非常流行,今天小編給大家從頭到尾做一個案例分享到腳本之家平臺,需要的朋友參考下吧
    2019-11-11
  • 解決Android TabLayout 在寬屏幕上tab不能平均分配的問題

    解決Android TabLayout 在寬屏幕上tab不能平均分配的問題

    這篇文章主要介紹了解決Android TabLayout 在寬屏幕上tab不能平均分配的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Android APK 32位和64位的區(qū)別及說明

    Android APK 32位和64位的區(qū)別及說明

    這篇文章主要介紹了Android APK 32位和64位的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Flutter輪播圖效果的實現(xiàn)步驟

    Flutter輪播圖效果的實現(xiàn)步驟

    這篇文章主要介紹了Flutter輪播圖效果的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Android編程開發(fā)ScrollView中ViewPager無法正常滑動問題解決方法

    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)鍵盤彈窗示例詳解

    這篇文章主要為大家介紹了flutter實現(xiàn)掃碼槍獲取數(shù)據(jù)源禁止系統(tǒng)鍵盤彈窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論