1 package com.bumptech.glide.load.engine; 2 3 import android.os.Handler; 4 import android.os.Message; 5 6 import com.bumptech.glide.util.Util; 7 8 /** 9 * A class that can safely recycle recursive resources. 10 */ 11 class ResourceRecycler { 12 private boolean isRecycling; 13 private final Handler handler = new Handler(new ResourceRecyclerCallback()); 14 15 public void recycle(Resource<?> resource) { 16 Util.assertMainThread(); 17 18 if (isRecycling) { 19 // If a resource has sub-resources, releasing a sub resource can cause it's parent to be synchronously 20 // evicted which leads to a recycle loop when the parent releases it's children. Posting breaks this loop. 21 handler.obtainMessage(ResourceRecyclerCallback.RECYCLE_RESOURCE, resource).sendToTarget(); 22 } else { 23 isRecycling = true; 24 resource.recycle(); 25 isRecycling = false; 26 } 27 } 28 29 private static class ResourceRecyclerCallback implements Handler.Callback { 30 public static final int RECYCLE_RESOURCE = 1; 31 32 @Override 33 public boolean handleMessage(Message message) { 34 if (message.what == RECYCLE_RESOURCE) { 35 Resource resource = (Resource) message.obj; 36 resource.recycle(); 37 return true; 38 } 39 return false; 40 } 41 } 42 } 43