Android 實現(xiàn)單線程輪循機制批量下載圖片
Android 實現(xiàn)單線程輪循機制批量下載圖片
listview 在為item 添加從網(wǎng)上下載下來的圖片時, 如果每次都整合一個item時都需要new一個Thread去下載圖片,listview長時間滑動時會產(chǎn)生大量線程。
用單線程輪循機制則可以解決這個問題
步驟如下:
1、需要一個任務(wù)集合
class imageViewTask{
String path;
Bitmap bitmap;
int position;
}
// 任務(wù)集合 private List<imageViewTask> imageviews = new ArrayList<MusicAdapter.imageViewTask>();
2、在構(gòu)造方法中創(chuàng)建一個線程,通過任務(wù)集合中的path去網(wǎng)上下載圖片獲得bitmap并放置在這個任務(wù)中以Message的obj形式傳送給handler處理。
只有在為listview設(shè)置適配器時才需要創(chuàng)建這個工作線程, 且只有一個
(while(true)循環(huán) 在activity 調(diào)用OnDestroy )才會終止
// 獲得圖片bitmap
workThread = new Thread(){
public void run() {
while(isLoop){
if(!imageviews.isEmpty()){
try {
Message msg = new Message();
// 獲得圖片的bitmap
msg.obj = GetImageviewBitmap();
msg.what = HANDLER_LOAD_IMAGEVIEW_SUCCESS;
// 發(fā)消息給主線程
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}else{
synchronized (workThread) {
try {
//任務(wù)隊列為空則等待
workThread.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//GetImageviewBitmap()方法
// 獲得圖片的bitmap
private imageViewTask GetImageviewBitmap() throws Exception, IOException {
imageViewTask ivt = imageviews.remove(0);
String uri = BasicUri.BasicHttpUri+ivt.path;
HttpEntity entity = new HttpUtils().SetHttp(uri, HttpUtils.GET_METHOD, null);
byte[] bytes = EntityUtils.toByteArray(entity);
Bitmap bitmap = BitmapUtils.loadBitmap(bytes, 50, 50);
// 將網(wǎng)上下載的圖片存入緩存集合中
map.put(ivt.path, new SoftReference<Bitmap>(bitmap));
ivt.bitmap = bitmap;
return ivt;
}
};
workThread.start();
}
這個是httpUtils工具
public class HttpUtils {
public final static int GET_METHOD = 1;
public final static int POST_MEHTOD = 2;
/**
* 構(gòu)造方法
* @param uri 路徑
* @param method 發(fā)送消息模式 GET_METHOD用get方式傳送消息 POST_MEHTOD用post方式傳送消息
*/
public static HttpEntity SetHttp(String uri, int method, List<NameValuePair> pairs) throws Exception{
HttpClient client=new DefaultHttpClient();
HttpResponse resp = null;
switch (GET_METHOD) {
// 用get方式發(fā)送消息
case GET_METHOD:
HttpGet get=new HttpGet(uri);
resp=client.execute(get);
break;
// 用post方式發(fā)送消息
case POST_MEHTOD:
HttpPost post=new HttpPost(uri);
HttpEntity entity=new UrlEncodedFormEntity( pairs, "utf-8");
post.setEntity(entity);
post.setHeader("Content-Type",
"application/x-www-form-urlencoded");
resp=client.execute(post);
break;
}
return resp.getEntity();
}
}
3、在自定義adapter 的setView方法中在任務(wù)中放置圖片下載的path和position, 并為item中的imageview設(shè)置標(biāo)記, 為了在listview的item中放入圖片時的方便。
// 給imageview設(shè)置標(biāo)記
holder.iv.setTag(position);
// 增加任務(wù)隊列
imageViewTask task = new imageViewTask();
task.path = musics.get(position).getAlbumpic();
task.position = position;
imageviews.add(task);
// 通知工作線程可以下載圖片了
synchronized (workThread) {
workThread.notify();
}
4、傳送消息給主線程,讓hanler去更新UI
// handler
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case HANDLER_LOAD_IMAGEVIEW_SUCCESS:
// 更新UI
imageViewTask ivt = (imageViewTask) msg.obj;
ImageView iv = (ImageView) listview.findViewWithTag(ivt.position);
if(iv != null){
if(ivt.bitmap != null)
iv.setImageBitmap(ivt.bitmap);
}else{
iv.setImageResource(R.drawable.ic_launcher);
}
break;
}
};
};
以上就是使用Android 批量下載圖片的講解,如有疑問請留言或者到本站社區(qū)進行交流討論,大家共同進步,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android 使用 ViewPager循環(huán)廣告位的實現(xiàn)
本文給大家分享android使用 ViewPager循環(huán)廣告位的實現(xiàn),感興趣的朋友一起學(xué)習(xí)吧2015-11-11
Android使用Service實現(xiàn)IPC通信的2種方式
這篇文章主要介紹了Android使用Service實現(xiàn)IPC通信的2種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Flutter使用AnimatedBuilder實現(xiàn)動效復(fù)用
Animation和AnimationWidget都是將組件和動畫一起完成的。有些時候,我們只是想動效復(fù)用,而不關(guān)心組件構(gòu)建,這個時候就可以使用 AnimatedBuilder了。本文詳細講解了AnimatedBuilder的使用,需要的可以參考一下2022-04-04
Android XmlPullParser 方式解析 Xml 文檔
這篇文章主要介紹了Android XmlPullParser 方式解析 Xml 文檔的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android 軟鍵盤出現(xiàn)不適應(yīng)的解決辦法總結(jié)
這篇文章主要介紹了Android 軟鍵盤出現(xiàn)不適應(yīng)的解決辦法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03
使用Android原生WebView+Highcharts實現(xiàn)可左右滑動的折線圖
折線圖是Android開發(fā)中經(jīng)常會碰到的效果,但由于涉及自定義View的知識,對許多剛?cè)腴T的小白來說會覺得很高深,下面這篇文章主要給大家介紹了關(guān)于如何使用Android原生WebView+Highcharts實現(xiàn)可左右滑動的折線圖的相關(guān)資料,需要的朋友可以參考下2022-05-05

