Asynctask不为imageview设置imageresource

时间:2016-07-12 20:16:12

标签: android gridview android-asynctask imageview android-scroll

我是Android的新手,所以不确定我在这里做错了什么。我有一个gridview,我正在显示一堆图片,我正在使用适配器来填充gridview。 gridview滚动非常缓慢/滞后,所以我尝试使用asynctask为imageviews设置imageresource。出于某种原因,图像视图没有获得资源,因此它们只是显示为空白。这是我的代码:

class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            Display display = wm.getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            imageView.setLayoutParams(new GridView.LayoutParams(width/2,(width/2)*515/400));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0);
        } else {
            imageView = (ImageView) convertView;
        }

        //imageView.setImageResource(mThumbIds[position]);
        ImageSetter task=new ImageSetter(imageView);
        task.execute(position);

        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.zsmall_artemis,R.drawable.zsmall_ash,R.drawable.zsmall_bane,R.drawable.zsmall_belle,R.drawable.zsmall_caleb,R.drawable.zsmall_falcyn,R.drawable.zsmall_jaden,R.drawable.zsmall_julien,R.drawable.zsmall_kody,
            R.drawable.zsmall_mack,R.drawable.zsmall_maxis,R.drawable.zsmall_nero,R.drawable.zsmall_nick,R.drawable.zsmall_nykyrian
    };

    class ImageSetter extends AsyncTask<Integer,Void,Integer>{
        private final WeakReference<ImageView> imageViewReference;

        public ImageSetter(ImageView imageview){
            imageViewReference=new WeakReference<ImageView>(imageview);
        }
        @Override
        protected Integer doInBackground(Integer... ImagePos){
            return mThumbIds[ImagePos[0]];
        }


        protected void onPostExecute(int ImageId){
            if(isCancelled()){
                ImageId=mThumbIds[0];
            }
            if(imageViewReference != null){
                ImageView iview = imageViewReference.get();
                if(iview != null){
                    iview.setImageResource(ImageId);


                }
            }
        }
    }
}

图片资源ID全部存储在数组中,'position'用于指示我所指的数组元素。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

可能只是ImageView或GridView没有意识到它已被更新。如果是这种情况,可以使用invalidate()调用来修复它。

if(imageViewReference != null){
   ImageView iview = imageViewReference.get();
     if(iview != null){
        iview.setImageResource(ImageId);

        //invalidate call
        iview.invalidate();

   }
}
但是,它可能不止于此。如果这对您有用,请告诉我。

答案 1 :(得分:0)

我不相信有任何理由在另一个线程上加载本地资产。此外,当UI更新时,必须在主线程上完成,因此多线程无法帮助它。其他线程应该用于加载来自互联网的图像和信息。

答案 2 :(得分:0)

尝试将库用于图像加载器,例如Glide。在我看来,Glide是有史以来最好的imageLoader。它速度快,内存管理最好,因此永远不会出现内存不足的情况。