public void unsubscribe(USK origUSK, USKCallback cb) { USKFetcher toCancel = null; synchronized (this) { USK clear = origUSK.clearCopy(); USKCallback[] callbacks = subscribersByClearUSK.get(clear); if (callbacks == null) { // maybe we should throw something ? shall we allow multiple unsubscriptions ? if (logMINOR) Logger.minor(this, "No longer subscribed"); return; } int j = 0; for (USKCallback c : callbacks) { if ((c != null) && (c != cb)) { callbacks[j++] = c; } } USKCallback[] newCallbacks = Arrays.copyOf(callbacks, j); if (newCallbacks.length > 0) subscribersByClearUSK.put(clear, newCallbacks); else { subscribersByClearUSK.remove(clear); } USKFetcher f = backgroundFetchersByClearUSK.get(clear); if (f != null) { f.removeSubscriber(cb, context); if (!f.hasSubscribers()) { toCancel = f; backgroundFetchersByClearUSK.remove(clear); } } // Temporary background fetchers run once and then die. // They do not care about callbacks. } if (toCancel != null) { toCancel.cancel(null, context); } else { if (logMINOR) Logger.minor(this, "Not found unsubscribing: " + cb + " for " + origUSK); } }