亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

LruCash使用showImageByThread有Bug

1.剛載入時,可見項目除了最後一個有載入圖片(有時還錯位),其它只顯示ic_launcher

http://img1.sycdn.imooc.com//557704bd0001efde07681280.jpg

2.要滾動畫面好幾次才會全部載入對應的圖片

程式碼如下?

ImageLoader.java

ImageView?imageView;
String?url;
LruCache<String,?Bitmap>?bitmapLruCache;

public?ImageLoader()?{
????int?maxMemory?=?(int)?Runtime.getRuntime().maxMemory();
????int?cashSize?=?maxMemory?/?4;
????bitmapLruCache?=?new?LruCache<String,?Bitmap>(cashSize)?{
????????@Override
????????protected?int?sizeOf(String?key,?Bitmap?value)?{
????????????return?value.getByteCount();
????????}
????};
}

private?Handler?handler?=?new?Handler()?{
????@Override
????public?void?handleMessage(Message?msg)?{
????????if?(imageView.getTag().equals(url))?{
????????????imageView.setImageBitmap((Bitmap)?msg.obj);
????????}
????}
};

public?void?showImageByThread(ImageView?imageView,?final?String?url)?{

????this.imageView?=?imageView;
????this.url?=?url;
????Bitmap?bitmap?=?getBitmapFromCash(url);

????//緩衝沒有bitmap,從網路下載

????if?(bitmap?==?null)?{
????????new?Thread()?{
????????????@Override
????????????public?void?run()?{
????????????????Bitmap?bitmap?=?getBitmapFromURL(url);
????????????????//將下載的bitmap存到緩衝
????????????????addBitmapToCash(url,?bitmap);

????????????????Message?msg?=?Message.obtain();
????????????????msg.obj?=?bitmap;
????????????????handler.sendMessage(msg);
????????????}
????????}.start();
????}?else?{
????????imageView.setImageBitmap(bitmap);
????}
}

public?Bitmap?getBitmapFromURL(String?url)?{
????Bitmap?bitmap?=?null;
????try?{
????????URLConnection?connection?=?new?URL(url).openConnection();
????????InputStream?is?=?connection.getInputStream();
????????bitmap?=?BitmapFactory.decodeStream(is);
????????is.close();
????}?catch?(IOException?e)?{
????????e.printStackTrace();
????}
????return?bitmap;
}

public?void?addBitmapToCash(String?url,?Bitmap?bitmap)?{
????if?(bitmap?!=?null)?{
????????bitmapLruCache.put(url,?bitmap);
????}
}

public?Bitmap?getBitmapFromCash(String?url)?{
????return?bitmapLruCache.get(url);
}


正在回答

4 回答

還有個可能,看你代碼你加載圖片的時候是不是調用的showImageByThread(ImageView?imageView,?final?String?url)

這個方法?

你這個loader中只有1個ImageView的引用,多次調用后,這個引用只指向最后一個ImageView,這也許就是為什么只有最后一個圖片顯示的原因吧。

顯示網絡圖片有好多庫可以用,universalImageLoader,google的volley。。。。。

1 回復 有任何疑惑可以回復我~
#1

eric_0023 提問者

有可能,但為了多次滑動後就每個對應圖片就能顯示
2015-06-10 回復 有任何疑惑可以回復我~
#2

orangesweet 回復 eric_0023 提問者

多次滑動相當于多次調用吧,再次調用的時候圖片應該已經下好了,直接從緩存中取,比較快,有可能在下次調用showImageByThread前,就已經把上一個imageview的圖片從緩存中取出,并且顯示好了。
2015-06-10 回復 有任何疑惑可以回復我~
#3

eric_0023 提問者 回復 orangesweet

很有道理,謝謝,我試著改看看
2015-06-10 回復 有任何疑惑可以回復我~
#4

eric_0023 提問者

非常感謝!
2015-06-10 回復 有任何疑惑可以回復我~
查看1條回復

把new handler的操作放在你的showImageByThread()里就可以了

1 回復 有任何疑惑可以回復我~

回復 iceliuorange:可以了,把圖片下載獨立成內部類,呼叫時把imageview和url傳進去

public?void?showImageByThread(ImageView?imageView,?final?String?url)?{
????Bitmap?bitmap?=?getBitmapFromCash(url);

????//緩衝沒有bitmap,從網路下載
????if?(bitmap?==?null)?{
????????new?ImageHandlerThreat(imageView,?url).startThread();
????}?else?{
????????imageView.setImageBitmap(bitmap);
????}
}

private?class?ImageHandlerThreat?{
????private?ImageView?imageView;
????private?String?url;

????private?Handler?handler?=?new?Handler()?{
????????@Override
????????public?void?handleMessage(Message?msg)?{
????????????if?(imageView.getTag().equals(url))?{
????????????????imageView.setImageBitmap((Bitmap)?msg.obj);
????????????}
????????}
????};

????public?ImageHandlerThreat(ImageView?imageView,?String?url)?{
????????this.imageView?=?imageView;
????????this.url?=?url;
????}

????public?void?startThread()?{
????????new?Thread()?{
????????????@Override
????????????public?void?run()?{
????????????????Bitmap?bitmap?=?getBitmapFromURL(url);
????????????????//將下載的bitmap存到緩衝
????????????????addBitmapToCash(url,?bitmap);

????????????????Message?msg?=?Message.obtain();
????????????????msg.obj?=?bitmap;
????????????????handler.sendMessage(msg);
????????????}
????????}.start();
????}
}


1 回復 有任何疑惑可以回復我~

public?void?handleMessage(Message?msg)?{

????????if?(imageView.getTag().equals(url))?{

????????????imageView.setImageBitmap((Bitmap)?msg.obj);

????????}

????}

這里打個斷點,看是什么問題

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Android必學-異步加載
  • 參與學習       50616    人
  • 解答問題       333    個

了解Android中的異步加載處理方法,這是面試問的最多的知識點

進入課程

LruCash使用showImageByThread有Bug

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號