Android 每次在AsyncTask中加载映像时

Android 每次在AsyncTask中加载映像时,android,android-layout,android-asynctask,Android,Android Layout,Android Asynctask,我正在从URL获取图像。我使用AsyncTask显示图像。但每次我上下滚动时,图像都会重新加载 这是我的密码 public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View

我正在从URL获取图像。我使用AsyncTask显示图像。但每次我上下滚动时,图像都会重新加载

这是我的密码

public View getView(final int position, View convertView,
        ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.useryouramourstlist, null,
            true);

    final ImageView userprofilepic = (ImageView) view
            .findViewById(R.id.userprofilepic);

    try
    {

        new ImageLoader().execute(view, +URL+listArrphoto[position]);

    }
    catch(Exception e)
    {

    }

    return view;
}


public class ImageLoader extends AsyncTask<Object, String, Bitmap> {

    private View view;
    private Bitmap bm = null;

    @Override
    protected Bitmap doInBackground(Object... parameters) {

        // Get the passed arguments here
        view = (View) parameters[0];
        String uri = (String)parameters[1];


        bm = loadImageFromUrl(uri);

        return bm;
        //return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (bitmap != null && view != null) {
            ImageView albumArt = (ImageView) view.findViewById(R.id.userprofilepic);
            albumArt.setImageBitmap(bitmap);
        }
    }
}

public static Bitmap loadImageFromUrl(String url) {

    Bitmap bm;
    try {  

            URL aURL = new URL(url);  
            URLConnection conn = aURL.openConnection(); 

            conn.connect();  
            InputStream is = null;
            try
            {
             is= conn.getInputStream();  
            }catch(IOException e)
            {
                 return null;
            }

            BufferedInputStream bis = new BufferedInputStream(is);  

            bm = BitmapFactory.decodeStream(bis);

            bis.close();  
            is.close();  

       } catch (IOException e) {  
        return null;
       }  

    return  Bitmap.createScaledBitmap(bm,60,60,true);


}
public View getView(最终int位置,视图转换视图,
视图组(父级){
LayoutInflater充气器=(LayoutInflater)getSystemService(Activity.LAYOUT\u充气器\u SERVICE);
视图=充气机。充气(R.layout.useryouramourstlist,null,
正确的);
最终图像视图userprofilepic=(图像视图)视图
.findviewbyd(R.id.userprofilepic);
尝试
{
新建ImageLoader()。执行(视图,+URL+listArrphoto[position]);
}
捕获(例外e)
{
}
返回视图;
}
公共类ImageLoader扩展了异步任务{
私人视野;
私有位图bm=null;
@凌驾
受保护位图doInBackground(对象…参数){
//在这里获取传递的参数
视图=(视图)参数[0];
字符串uri=(字符串)参数[1];
bm=loadImageFromUrl(uri);
返回bm;
//返回位图;
}
@凌驾
受保护的void onPostExecute(位图){
if(位图!=null&&view!=null){
ImageView albumArt=(ImageView)view.findViewById(R.id.userprofilepic);
albumArt.setImageBitmap(位图);
}
}
}
公共静态位图loadImageFromUrl(字符串url){
位图bm;
试试{
URL aURL=新URL(URL);
URLConnection conn=aURL.openConnection();
连接();
InputStream=null;
尝试
{
is=conn.getInputStream();
}捕获(IOE异常)
{
返回null;
}
BufferedInputStream bis=新的BufferedInputStream(is);
bm=BitmapFactory.decodeStream(bis);
二、关闭();
is.close();
}捕获(IOE){
返回null;
}  
返回位图.createScaledBitmap(bm,60,60,true);
}

另一个简单的选项是在加载图像调用
view.setTag(位图)
后,在您的
ImageView上,在尝试获取图像之前,请进行一次完整性检查,尽管根据列表大小可能会占用大量内存

if(view.getTag() != null) {
    view.setImageBitmap((Bitmap)view.getTag());
} else {
    new ImageLoader().execute(view, +URL+listArrphoto[position]);
}

当然,我会选择下载到应用程序缓存目录并从文件加载(如果存在)。

如果要避免每次下载图像,则需要缓存图像。使用通用图像加载器的LazyList。检查链接,但为什么每次上下滚动时都会加载图像。如果我在没有使用AsyncTask的情况下使用,则在向上或向下滚动时不会反复加载。您可能正在getview中调用AsyncTask。您能告诉我如何执行此操作吗?如何使用惰性列表或UIL检查第一条注释中的链接。它将图像缓存在SC卡或手机存储器中。如果已经存在,请从缓存中显示,否则请下载缓存并显示。您也可以尝试将其存储到地图中,其中键是url,值是位图。同样,我不建议对大型列表使用此选项。