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