我是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。它速度快,并且最擅长内存管理,因此您永远不会收到内存不足异常。