Android: caching items to improve performance

I am trying to cache Drawable objects that are listed:

Inside the adapter there is the following:

private final ImageThreadloader imageloader=new ImageThreadloader();

public View getView(int position, View convertView, ViewGroup parent)
    {
        View row=convertView;
        ViewWrapper wrapper=null;
        Activity activity=(Activity)getContext();

        RssItem item=getItem(position);

        if (row == null) {

            LayoutInflater inflater=activity.getLayoutInflater();
            row=inflater.inflate(R.layout.row,null);
            wrapper=new ViewWrapper(row);
            row.setTag(wrapper);
        }
        else
        {
            wrapper=(ViewWrapper)row.getTag();
        }

        wrapper.getTitle().setText(item.getTitle());
        String cleaned=item.getDescription().replaceAll("\\<.*?\\>", "");
        int Long=cleaned.length();
        if (Long<=100)
        {
            wrapper.getDescription().setText(cleaned);
        }
        else wrapper.getDescription().setText(cleaned.substring(0, 50)+"...");

        String laurl=item.getImageUrl();

        if (laurl!="") 
        { 
            imageloader.loadImage(laurl, (ImageView)wrapper.getImage());
        }
        else 
        {
            wrapper.getImage().setImageResource(R.drawable.icon);
        }

        return row;

    }

    static class ViewWrapper {

        private View base;
        private TextView title=null;
        private TextView description=null;
        private ImageView icono=null;

        ViewWrapper (View base) {
            this.base=base;
        }

        public TextView getTitle() {
            if (title==null) {
                title=(TextView)base.findViewById(R.id.TitleText);
            }
            return title;
        }

        public TextView getDescription() {
            if (description==null) {
                description=(TextView)base.findViewById(R.id.DescriptionText);
            }
            return description;
        }

        public ImageView getImage() {
            if (icono==null) {
                icono=(ImageView)base.findViewById(R.id.ImageIcon);
            }
            return icono;
        }       

    }

And the ImageThreadLoad class looks like this:

public class ImageThreadloader  {


    public void loadImage(String imageurl,ImageView imageview) 
    {
            DrawableDownLoaderTask imagetask= new DrawableDownLoaderTask(imageview);            
            imagetask.execute(imageurl);
    }


    public static Drawable loadImageFromUrl(String url) {
        InputStream inputStream;
        try {
            inputStream = new URL(url).openStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return Drawable.createFromStream(inputStream, "src");
    }

    class DrawableDownLoaderTask extends AsyncTask<String, Void, Drawable> {

        private String url;
        private final WeakReference<ImageView> imageviewreference;      

        public DrawableDownLoaderTask(ImageView imageview) {
            imageviewreference=new WeakReference<ImageView>(imageview);
        }

        @Override
        protected Drawable doInBackground(String... params)
        {
            url=params[0];
            Drawable drawable=loadImageFromUrl(url);
            return drawable;

        }

        @Override
        protected void onPostExecute(Drawable drawable)
        {

            if (isCancelled()) 
            {
                drawable=null;
            }

            if (imageviewreference!=null)
            {
                ImageView imageview=imageviewreference.get();
                if (imageview!=null)
                {
                    imageview.setImageDrawable(drawable);
                }
            }



        }
    }
}

Works fine, but has some delay if I scroll through the list quickly. I read several manuals, and the solution is always the same: cache.

SO I tried the following (changing the class loading the image into a separate stream):

private final HashMap <String, SoftReference <Drawable>> imagecache= new HashMap <String, SoftReference<Drawable>>();

    public void loadImage(String imageurl,ImageView imageview) 
    {
        if (imagecache.containsKey(imageurl))
        {
            SoftReference<Drawable> drawable= imagecache.get(imageurl);
            imageview.setImageDrawable(drawable.get());
        }
        else
        {   
            DrawableDownLoaderTask imagetask= new DrawableDownLoaderTask(imageview);
            imagetask.execute(imageurl);
        }

    }
    class DrawableDownLoaderTask extends AsyncTask<String, Void, Drawable> {

        private String url;
        private final WeakReference<ImageView> imageviewreference;      

        public DrawableDownLoaderTask(ImageView imageview) {
            imageviewreference=new WeakReference<ImageView>(imageview);
        }

        @Override
        protected Drawable doInBackground(String... params)
        {
            url=params[0];
            Drawable drawable=loadImageFromUrl(url);
            if (drawable!=null) imagecache.put(url, new SoftReference<Drawable>(drawable));
            return drawable;

        }

        @Override
        protected void onPostExecute(Drawable drawable)
        {
            ImageView imageview=imageviewreference.get();
            imageview.setImageDrawable(drawable);
        }
    }

Everything seems to be working fine, but when I scroll through the images, I start to fade in some lines. Something is wrong? Any tool to help me solve these problems?

Thanks in advance

+5
source share
1

.

SoftReference<Drawable> drawable= imagecache.get(imageurl);
imageview.setImageDrawable(drawable.get());

SoftReference , . drawable.get() null, .

ignition - , .

0

All Articles