我正在使用网格视图来显示我存储的图像,但是当我向下滚动时,图像在图像视图中消失并且不再加载。我还使用线程将图像加载到图像视图中。 这是我的代码(这些代码也在我的网格视图适配器类中):
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Log.e("sara" , "this part takes time");
LayoutInflater inflater = getLayoutInflater();
convertView = getLayoutInflater().inflate(R.layout.gallery_gridsq, parent, false);
iv = (ImageView) convertView.findViewById(R.id.icon);
file = new File(Uri.parse(getItem(position).toString()).getPath());
new myTask(iv, file).execute();
return convertView;
}
private class myTask extends AsyncTask <Void , Void ,Bitmap> {
ImageView iv;
File file;
public myTask(ImageView iv, File file) {
this.iv=iv;
this.file= file;
}
@Override
protected Bitmap doInBackground(Void... params) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inJustDecodeBounds = false;
options.inSampleSize = 8;
try {
bmp = BitmapFactory.decodeStream(new FileInputStream(file), null, options);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return bmp;
}
@Override
protected void onPostExecute(Bitmap aVoid) {
iv.setImageBitmap(aVoid);
}
}
答案 0 :(得分:0)
我能想到导致类似麻烦的内存问题。
使用日志向下滚动时,检查是否仍然调用了getView:Log.e("sara" , "this part takes time");
如果向下滚动时调用该行,请检查android studio中提供的android监视器中的内存。
点击底部的android monitor
&gt; monitors
&GT;并根据设置(可能是128或256MB)观察内存是否达到上限。
如果是这样,你就会遇到记忆问题。可能的原因是您没有回收列表并且内存正在堆叠。在内存的高峰期,图像将不会被加载。
它的实现应该是在您向下滚动并加载新图像时删除已加载的图像。
另外,尝试使用glide因为它有一个很好的内存问题解决方案,并且在许多领域通常比bitmapfactory更好。