public static void forEachImageUrlInHtml(@Nullable final androidx.core.util.Consumer<String> callback, @Nullable final String ... htmlText) {
        //shortcut for nulls
        if (htmlText == null || callback == null) {
            return;
        }
        try (ContextLogger cLog = new ContextLogger(Log.LogLevel.DEBUG, "forEachImageUrlInHtml")) {
            final boolean debug = Log.isDebug();
            for (final String text : htmlText) {
                //skip null or empty texts
                if (StringUtils.isBlank(text)) {
                    continue;
                }
                final AtomicInteger count = debug ? new AtomicInteger(0) : null;
                if (debug) {
                    cLog.add("size:" + text.length());
                }
                //Performance warning: do NOT use HtmlCompat.fromHtml here - it is far too slow
                //Example: scanning listing of GC89AXV (approx. 900KB text, 4002 images inside)
                //-> takes > 4000ms with HtmlCompat.fromHtml, but only about 50-150ms with regex approach
                final Matcher m = IMG_TAG.matcher(text);
                while (m.find()) {
                    if (m.groupCount() == 1) {
                        if (debug) {
                            count.addAndGet(1);
                        }
                        callback.accept(m.group(1));
                    }
                }
                if (debug) {
                    cLog.add("#found:" + count);
                }
            }
        }
    }
Add images present in the HTML description to the existing collection.

@param htmlText the HTML description to be parsed, can be repeated
main/src/main/java/cgeo/geocaching/utils/ImageUtils.java