异步任务未为图像视图设置图像资源



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

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 都存储在数组中,"位置"用于指示我指的是哪个数组元素。我该如何解决这个问题?

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

if(imageViewReference != null){
   ImageView iview = imageViewReference.get();
     if(iview != null){
        iview.setImageResource(ImageId);
        //invalidate call
        iview.invalidate();
   }
}

不过,它可能不止于此。让我知道这是否适合您。

我不

相信有任何理由在另一个线程上加载本地资产。此外,当 UI 更新时,必须在主线程上完成,因此多线程对此没有帮助。其他线程应该用于从互联网加载图像和信息等事情。

尝试将库用于图像加载器,例如 Glide。在我看来,Glide是有史以来最好的imageLoader。它速度快,并且最擅长内存管理,因此您永远不会收到内存不足异常。

最新更新