色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > android ListView異步加載圖片

          android ListView異步加載圖片

          作者: 時(shí)間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

          ListView異步加載圖片是非常實(shí)用的方法,凡是是要通過網(wǎng)絡(luò)獲取圖片資源一般使用這種方法比較好,用戶體驗(yàn)好,不用讓用戶等待下去,下面就說實(shí)現(xiàn)方法,先貼上主方法的代碼

          本文引用地址:http://cafeforensic.com/article/201609/305008.htm

          public class AsyncImageLoader {

          private HashMap

          public AsyncImageLoader() {

          imageCache = new HashMap

          }

          public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {

          if (imageCache.containsKey(imageUrl)) {

          SoftReference softReference = imageCache.get(imageUrl);

          Drawable drawable = softReference.get();

          if (drawable != null) {

          return drawable;

          }

          }

          final Handler handler = new Handler() {

          public void handleMessage(Message message) {

          imageCallback.imageLoaded((Drawable) message.obj, imageUrl);

          }

          };

          new Thread() {

          @Override

          public void run() {

          Drawable drawable = loadImageFromUrl(imageUrl);

          imageCache.put(imageUrl, new SoftReference(drawable));

          Message message = handler.obtainMessage(0, drawable);

          handler.sendMessage(message);

          }

          }.start();

          return null;

          }

          public static Drawable loadImageFromUrl(String url) {

          URL m;

          InputStream i = null;

          try {

          m = new URL(url);

          i = (InputStream) m.getContent();

          } catch (MalformedURLException e1) {

          e1.printStackTrace();

          } catch (IOException e) {

          e.printStackTrace();

          }

          Drawable d = Drawable.createFromStream(i, src);

          return d;

          }

          public interface ImageCallback {

          public void imageLoaded(Drawable imageDrawable, String imageUrl);

          }

          }

          實(shí)現(xiàn)方式:通過傳入圖片的網(wǎng)絡(luò)地址和一個(gè)實(shí)現(xiàn)ImageCallback行為的對(duì)象,當(dāng)imageCache存在這個(gè)圖片時(shí)候,返回這個(gè)圖片,當(dāng)imageCache沒有這個(gè)圖片時(shí),實(shí)例一個(gè)異步線程來下載圖片并同時(shí)返回為null,最后在圖片下載完成的時(shí)候,調(diào)用imageLoaded方法。

          現(xiàn)說說這個(gè)類設(shè)計(jì)的優(yōu)點(diǎn)吧:1.采用了策略模式;2.使用SoftReference關(guān)鍵字

          先說說策略模式,程序里把每次下載圖片完成后所進(jìn)行的操作封裝成一個(gè)ImageCallback抽象類,使系統(tǒng)更靈活,并易于擴(kuò)展。

          在Java中內(nèi)存管理,引用分為四大類,強(qiáng)引用HardReference、弱引用WeakReference、軟引用SoftReference和虛引用PhantomReference。它們的區(qū)別也很明顯,HardReference對(duì)象是即使虛擬機(jī)內(nèi)存吃緊拋出OOM也不會(huì)導(dǎo)致這一引用的對(duì)象被回收,而WeakReference等更適合于一些數(shù)量不多,但體積稍微龐大的對(duì)象,在這四個(gè)引用中,它是最容易被垃圾回收的,而我們對(duì)于顯示類似Android Market中每個(gè)應(yīng)用的App Icon時(shí)可以考慮使用SoftReference來解決內(nèi)存不至于快速回收,同時(shí)當(dāng)內(nèi)存短缺面臨Java VM崩潰拋出OOM前時(shí),軟引用將會(huì)強(qiáng)制回收內(nèi)存,最后的虛引用一般沒有實(shí)際意義,僅僅觀察GC的活動(dòng)狀態(tài),對(duì)于測(cè)試比較實(shí)用同時(shí)必須和ReferenceQueue一起使用。對(duì)于一組數(shù)據(jù),我們可以通過HashMap的方式來添加一組SoftReference對(duì)象來臨時(shí)保留一些數(shù)據(jù),同時(shí)對(duì)于需要反復(fù)通過網(wǎng)絡(luò)獲取的不經(jīng)常改變的內(nèi)容,可以通過本地的文件系統(tǒng)或數(shù)據(jù)庫(kù)來存儲(chǔ)緩存。

          最后一句話說的很對(duì),事實(shí)上大多數(shù)情況也是如此。

          在說說它的用法吧,通常它作為一個(gè)adapter的一個(gè)變量如:

          class BookAdapter extends ArrayAdapter{

          AsyncImageLoader asyncImageLoader;

          Context mContext;

          BookAdapter(Context context,List data){

          super(context, 0, data);

          asyncImageLoader = new AsyncImageLoader();

          mContext = context;

          }

          @Override

          public View getView(int position, View convertView, ViewGroup parent) {

          ViewCache holder ;

          if(convertView==null){

          LayoutInflater inflate = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

          convertView = inflate.inflate(com.slider.cn.R.layout.list_item , null);

          holder = new ViewCache();

          holder.icon = (ImageView)convertView.findViewById(com.slider.cn.R.id.note_icon);

          holder.name = (TextView)convertView.findViewById(com.slider.cn.R.id.note_name);

          holder.date = (TextView)convertView.findViewById(com.slider.cn.R.id.note_date);

          convertView.setTag(holder);

          }else{

          holder = (ViewCache)convertView.getTag();

          }

          final BookInfo bookInfo = getItem(position);

          holder.name.setText(bookInfo.getName().toString());

          holder.date.setText(bookInfo.getInfo());

          holder.icon.setTag(bookInfo.getUri());

          //

          Drawable drawable = asyncImageLoader.loadDrawable(bookInfo.getUri(), new ImageCallback() {

          @Override

          public void imageLoaded(Drawable imageDrawable, String imageUrl) {

          ImageView imageViewByTag = (ImageView) BookListView.this.findViewWithTag(bookInfo.getUri());

          if (imageViewByTag!=null) {

          imageViewByTag.setImageDrawable(imageDrawable);

          }else {

          //load image failed from Internet

          }

          }

          });

          if(drawable==null){

          holder.icon.setImageDrawable(drawable_waiting);


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉