我正在尝试应用asynctask在listview项目中加载图像。
我还试图比较两个值,以便知道视图是否仍然需要加载图像。
@Override
public void bindView(View view, Context context, Cursor cursor) {
holder = (ViewHolder) view.getTag();
picPath = cursor.getString(18);
if(picPath == null || picPath.isEmpty()){
holder.myImage.setVisibility(View.GONE);
}else{
savingPath = picPath;
AsyncTask<Void, Void, Void> showImage = new AsyncTask<Void, Void, Void>(){
Bitmap b1;
String syncPath;
@Override
protected Void doInBackground(Void... params) {
syncPath = savingPath;
b1 = setImageToImageView(syncPath);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (syncPath.equalsIgnoreCase(picPath)){
holder.myImage.setTag(syncPath);
holder.myImage.setImageBitmap(b1);
holder.myImage.setVisibility(View.VISIBLE);
}else{
}
}
}
}
};
showImage.execute();
通过比较这两者 - 我想知道是否仍然需要用图像加载视图。
if (syncPath.equalsIgnoreCase(picPath))
我得到的是,有时它会加载图像,有时只加载少量图像,而且图像总是相同。
所以我在这里做错了什么?
感谢您提供任何帮助
修改
这是我所做的更改(仍然没有工作 - 使应用程序崩溃)
if(holder != null && holder.bitImage != null) {
holder.myImage.setImageBitmap(holder.bitImage);
holder.myImage.setVisibility(View.GONE);
}else{
savingPath = picPath;
AsyncTask<Void, Void, Void> showImage = new AsyncTask<Void, Void, Void>(){
Bitmap b1;
String syncPath;
@Override
protected Void doInBackground(Void... params) {
syncPath = savingPath;
b1 = setImageToImageView(syncPath);
return null;
}
@Override
protected void onPostExecute(Void result) {
holder.myImage.setTag(syncPath);
holder.myImage.setImageBitmap(holder.bitImage);
holder.bitImage = b1;
holder.myImage.setVisibility(View.VISIBLE);
}
};
showImage.execute();
答案 0 :(得分:0)
由于savingPath
在所有AsyncTasks之间共享,因此您可能遇到了同步问题。我建议您使用一些流行的库来加载图像:
这些是最受欢迎的。它们非常易于使用,除了它们内置缓存之外,因此您无需检查URL是否相同 - 如果图像已经加载,库将从其缓存中加载图像。
答案 1 :(得分:0)
我真的不需要你的if(picPath == null || picPath.isEmpty())条件,因为如果你已经下载了图像,你可以设置位图来查看持有者以保持位图对象。在holder中添加一个字段为 Bitmap bitImage 并分配b1。
改变这个..
if(picPath == null || picPath.isEmpty())
as ..
if(holder != null && holder.bitImage != null)
{
// set bitmap
holder.myImage.setImageBitmap(holder.bitImage)
}
else
{
// load the image using async task and set it to holder.bitImage
// also set it to the image view
holder.myimage.setImageBitmap(b1); // lets assume b1 is your image bitmap
holder.bitImage = b1;
}