Re: [問題] GridView BaseAdapter 異步讀圖順序錯誤

看板AndroidDev作者 (踏實的活著)時間10年前 (2014/06/17 01:40), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
YES 就是這樣,因為使用 ViewHolder 就會有 cache 所以需要判斷你的 AsyncTask 跑完,要 set 回去 View 是不是同一個,所以用 position 來比對。 然後還需要考慮以下問題: 1. AsyncTask 要被 cancel 的問題,因為 Activity 被 onDestory,不然容易有 memory leak 產生。 2. 還有多次 Run 相同要 download 的 AsyncTask 要避免。 3. HashMap 可以使用 android 提供的 LruCache class 避免, bitmap 所造成的memory 用太多 crash 以上建議自己管理 download pool ,而 AsyncTask 有兩種模式 SERIAL_EXECUTOR 和 THREAD_POOL_EXECUTOR 建議使用 “SERIAL_EXECUTOR”會容易控制,再來要確保 job 不重複執行可以用 HashMap Key 可能是一個 download url,value 就是 AsyncTask object 在 Run AsyncTask 之前去檢查 HashMap 的 Key 有沒有出現過 ,在決定跑(避免重複)然後 put,AsyncTask 跑完就移除掉 key,在 onDestory 記得要把 取出所有的 HashMap job 做 cancel 才不會造成 memory leak 最後結論就是使用 Android Volley lib 就不用那麼麻煩拉XD ※ 引述《fake01 (假面超人)》之銘言: : 大家好 : 經過各位高高手的提點之後, : 目前只用的方法,我試過之後似乎可以了? : 再請各位提點這樣的方法是否還是會有問題 : 首先在getView(....) : holder.ViewHolderImageView.setTag(position); : MyTaskParams mMyTaskParams= : new MyTaskParams(holder.ViewHolderImageView,position); : task = new loadJPG(); : task.execute(mMyTaskParams); : // MyTaskParams 包含 : // imageview = holder.ViewHoderImageView : // id = postion : 進入AsynceTask : protected MyTaskParams doInBackground(MyTaskParams... params) { : bmp = ............... (Integer)params[0].imagivew.getTag()) : //這時候 doInBackground 是使用 getTag來獲取 position : params[0].bitmap = bmp; : // 將產生的bmp 放入 class的 bitmap; : return params[0]; : } : protected void onPostExecute(final MyTaskParams mMyTaskParams) { : //if就是比對position 和 getTag() ,從sky的指點猜的方法 : if(mMyTaskParams.id ==(Integer)mMyTaskParams.imagivew.getTag()) : { : mMyTaskParams.imagivew.setImageBitmap( : (Bitmap)mMyTaskParams.bitmap); : //在顯示剛剛class包入的bitmap : } : } : 以上就可以正確的顯示,如果有任何問題 : 還請各位再提點。 : 謝謝大家 : ps. 如果嫌reload每次都要產生一次bmp太慢的話 : 就用 hashmap 判斷key 是否已經產出過bmp ,這樣快很多。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 219.85.121.56 ※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1402940453.A.567.html
文章代碼(AID): #1JdombLd (AndroidDev)
文章代碼(AID): #1JdombLd (AndroidDev)