国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 實現單線程輪循機制批量下載圖片

2019-10-22 18:31:41
字體:
來源:轉載
供稿:網友

Android 實現單線程輪循機制批量下載圖片

listview 在為item 添加從網上下載下來的圖片時, 如果每次都整合一個item時都需要new一個Thread去下載圖片,listview長時間滑動時會產生大量線程。

用單線程輪循機制則可以解決這個問題

步驟如下:

1、需要一個任務集合

class imageViewTask{   String path;   Bitmap bitmap;   int position;  } 
// 任務集合  private List<imageViewTask> imageviews = new ArrayList<MusicAdapter.imageViewTask>(); 

2、在構造方法中創建一個線程,通過任務集合中的path去網上下載圖片獲得bitmap并放置在這個任務中以Message的obj形式傳送給handler處理。

只有在為listview設置適配器時才需要創建這個工作線程, 且只有一個

(while(true)循環 在activity  調用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;    // 發消息給主線程        handler.sendMessage(msg);               } catch (IOException e) {        e.printStackTrace();       } catch (Exception e) {        e.printStackTrace();       }             }else{       synchronized (workThread) {        try {         //任務隊列為空則等待         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);     // 將網上下載的圖片存入緩存集合中     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;    /**   * 構造方法   * @param uri 路徑   * @param method 發送消息模式 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方式發送消息   case GET_METHOD:    HttpGet get=new HttpGet(uri);    resp=client.execute(get);    break;   // 用post方式發送消息   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方法中在任務中放置圖片下載的path和position, 并為item中的imageview設置標記, 為了在listview的item中放入圖片時的方便。

// 給imageview設置標記   holder.iv.setTag(position); // 增加任務隊列   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 批量下載圖片的講解,如有疑問請留言或者到本站社區進行交流討論,大家共同進步,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏南县| 通江县| 吴旗县| 石河子市| 台湾省| 巴马| 内丘县| 高平市| 河池市| 苗栗县| 山东省| 博野县| 张家界市| 满洲里市| 仪陇县| 峨边| 博罗县| 渑池县| 拜城县| 北川| 区。| 潢川县| 孟村| 淮安市| 溆浦县| 忻城县| 旬邑县| 方正县| 南岸区| 雷州市| 梓潼县| 沂源县| 台东县| 武穴市| 百色市| 安乡县| 乡宁县| 建湖县| 平顶山市| 巧家县| 桐城市|