public synchronized void setProvider(final IProviderGeoItemLayer<?> newProviderLayer, final int zLevel) {
        destroy();

        final IProviderGeoItemLayer<?>  providerLayer = newProviderLayer == null ? NOOP_GEOITEM_LAYER : newProviderLayer;
        final String logPraefix = "GeoItemLayer:" + getId() + "(" + providerLayer.getClass().getSimpleName() + "):";
        Log.d(logPraefix + " init " + zLevel);
        providerLayer.init(zLevel);
        this.providerLayer = providerLayer;
        this.mapWriter = new AsynchronousMapWrapper<>(new MapWriter(logPraefix, providerLayer));
        for (Map.Entry<K, Pair<GeoItem, Boolean>> entry : this.itemMap.entrySet()) {
            if (entry.getValue().second) {
                putToMap(entry.getKey(), entry.getValue().first, null);
            }
        }
    }
Sets a concrete map provider for this layer.
Provider can also be changed to another later by using this method.
main/src/main/java/cgeo/geocaching/unifiedmap/geoitemlayer/GeoItemLayer.java