@Override
    public void onFutureDone(final Future<File> future) {
      final File file = future.get();
      long id = 0;
      if (file != null) { // insert to database
        id = insertEntry(mUrl, file);
      }

      if (future.isCancelled()) {
        Utils.assertTrue(mProxySet.isEmpty());
        return;
      }

      synchronized (mTaskMap) {
        Entry entry = null;
        synchronized (mEntryMap) {
          if (file != null) {
            entry = new Entry(id, file);
            Utils.assertTrue(mEntryMap.put(mUrl, entry) == null);
          }
        }
        for (final TaskProxy proxy : mProxySet) {
          proxy.setResult(entry);
        }
        mTaskMap.remove(mUrl);
        freeSomeSpaceIfNeed(MAX_DELETE_COUNT);
      }
    }
 public void removeProxy(final TaskProxy proxy) {
   synchronized (mTaskMap) {
     Utils.assertTrue(mProxySet.remove(proxy));
     if (mProxySet.isEmpty()) {
       mFuture.cancel();
       mTaskMap.remove(mUrl);
     }
   }
 }