CircleImageView framework performance optimization skills and best practice
CircleImageView is a commonly used Android library to display round pictures in ImageView.Although CircleImageView is very convenient, it may encounter performance problems when processing a large number of round pictures.In order to improve the performance of CircleImageView and optimize its use, we need to understand some performance optimization skills and best practice.
1. Use cache: Use a cache to store pictures that have been converted into circular, you can avoid changing each time.You can use Lrucache or the latest picture cache library Glide to implement this function.
private LruCache<String, Bitmap> mImageCache;
// Initialize cache
private void initCache() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
mImageCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
// cache picture
private void cacheImage(String url, Bitmap image) {
if (getImageFromCache(url) != null) {
mImageCache.put(url, image);
}
}
// Get the picture from the cache
private Bitmap getImageFromCache(String url) {
return mImageCache.get(url);
}
2. Use asynchronous loading: When loading a large amount of pictures, using asynchronous loading can avoid the main thread from being blocked.You can use a thread pool or asynctask to achieve asynchronous load.
// The thread pool is asynchronous loading pictures
ExecutorService executorService = Executors.newFixedThreadPool(5);
Future<Bitmap> future = executorService.submit(new Callable<Bitmap>() {
@Override
public Bitmap call() throws Exception {
return loadImageFromNetwork(url);
}
});
// asynctask asynchronous loading picture
new AsyncTask<Void, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(Void... voids) {
return loadImageFromNetwork(url);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}.execute();
3. Use compressed pictures: Loading large -sized pictures will consume more memory and CPU resources, so you can compress the picture before loading the picture to reduce memory occupation.
// First get the wide height of the picture
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
int imageWidth = options.outWidth;
int imageHeight = options.outHeight;
// Calculate the scaling ratio
int MaxSize = 500; // Set the maximum width or maximum height
int scale = Math.max(imageWidth / maxSize, imageHeight / maxSize);
// Load the compressed picture according to the zoom ratio
options.inJustDecodeBounds = false;
options.inSampleSize = scale;
Bitmap compressedBitmap = BitmapFactory.decodeFile(filePath, options);
4. Avoid frequent GC: Frequent garbage recycling can cause the interface to stuck, so we need to avoid frequent creation and destroying objects on the main thread.You can try to use the objects as much as possible to avoid frequent creation and release of objects.
// Use the object pool to reuse the Bitmap object
private final ArrayDeque<Bitmap> mBitmapPool = new ArrayDeque<>();
private final int MAX_POOL_SIZE = 10;
private Bitmap getBitmapFromPool() {
if (!mBitmapPool.isEmpty()) {
return mBitmapPool.poll();
} else {
return Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
}
}
private void recycleBitmap(Bitmap bitmap) {
if (mBitmapPool.size() < MAX_POOL_SIZE) {
mBitmapPool.offer(bitmap);
} else {
// If the object pool is full, directly release the Bitmap object
bitmap.recycle();
}
}
By understanding these performance optimization skills and best practice, we can improve the performance of the CircleImageView library and optimize its use.Using cache, asynchronous loading, compressed pictures, and avoiding frequent GCs can greatly reduce the overhead of memory and CPUs, and increase the user experience of applications.Therefore, when using CircleImageView, please pay attention to these optimization methods and adjust and optimize according to the actual situation.