我是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'用于指示我所指的数组元素。我该如何解决这个问题?
答案 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。它速度快,内存管理最好,因此永远不会出现内存不足的情况。