Marek M.
Marek M.

Reputation: 3951

Custom ImageView performance

I created a custom ImageView - it's purpose is to fetch image from internet. It's declaration looks as below:

public class WebImageView extends ImageView {

    private String mUrl;

    private Bitmap mCachedBitmap;

    public String getUrl() { return mUrl; }
    public void setUrl(String url) {
        mUrl = url;

        if (mCachedImage == null) {
            new ImageDownloader(this).execute(mUrl);
        } else {
            setImageBitmap(mCachedImage);
        }
    }

    public WebImageView(Context context) {
        super(context);
    }

    public WebImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public WebImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public WebImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    private class ImageDownloader extends AsyncTask<String, Void, Bitmap> {

        private final ImageView mView;

        public ImageDownloader(ImageView view) {
            mView = view;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            String url = params[0];
            Bitmap image = null;

            try {
                InputStream in = new java.net.URL(url).openStream();
                image = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error Message", e.getMessage());
                e.printStackTrace();
            }

            return image;
        }

        protected void onPostExecute(Bitmap result) {
            mView.setImageBitmap(result);
        }

    }

}

And it's usage is pretty straightforward:

<com.myapp.views.controls.WebImageView
            android:layout_width="@dimen/restaurantLogoWidth"
            android:layout_height="@dimen/restaurantLogoHeight"
            url="@{restaurant.model.logoUrl}"
            style="@style/ImageView" />

The above xml is placed inside a android.support.v7.widget.RecyclerView. The problem is that when I scroll (or perform some animation) on my items list it performs horribly bad, meaning that scrolling (or animating) is not smooth. Any advice what can I change here to make it perform better?

Upvotes: 0

Views: 329

Answers (1)

Shmuel
Shmuel

Reputation: 3916

Don't build a custom view to do this. Just use Glide image loading library. https://github.com/bumptech/glide

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);  
String internetUrl = "http://i.imgur.com/DvpvklR.png";

Glide  
.with(context)
.load(internetUrl)
.into(targetImageView);

https://futurestud.io/tutorials/glide-getting-started

Recyclerview Adapter and Glide - same image every 4-5 rows

Upvotes: 1

Related Questions