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

作者: showsky (Ting Cheng)   2014-06-17 01:40:50
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 ,這樣快很多。

Links booklink

Contact Us: admin [ a t ] ucptt.com