Szworny Dziąch Szworny Dziąch - 2 months ago 18
Android Question

Custom ImageView performace

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?

Answer

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

Comments