Home | History | Annotate | Download | only in engine
      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