<p dir="auto"><strong>Glide Version</strong>:<br>
4.2.0</p>

<p dir="auto"><strong>Integration libraries</strong>:<br>
okhttp3-integration:4.2.0@aar</p>

<p dir="auto"><strong>Device/Android Version</strong>:<br>
Pixel 2 (but i'd be surprised, if it weren't like that on all others as well)</p>

<p dir="auto"><strong>Issue details / Repro steps / Use case background</strong>:<br>
I have a global LoggingListener set to my GlideApp and on some occasions wanna use an additional Listener to set the visibility of my View after loading is complete.<br>
Sometimes i have to influence other Views depending on the outcome of an Image load.</p>

<p dir="auto"><strong>Glide load line / <code class="notranslate">GlideModule</code> (if any) / list Adapter code (if any)</strong>:<br>
I assume, you can imagine that those RequestListener implementation do "anything"</p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="      GlideApp.with(view).load(url)
          .signature(new LongVersionSignature(pictureVersion))
          .listener(new VisibilitySettingListener&lt;Drawable&gt;(borderLayout))
          .listener(new TriggerLayoutNotifications&lt;Drawable&gt;())
          .listener(new LoggingListener&lt;Drawable&gt;())
          .diskCacheStrategy(DiskCacheStrategy.ALL)
          .into(image);"><pre class="notranslate">      <span class="pl-smi">GlideApp</span>.<span class="pl-en">with</span>(<span class="pl-s1">view</span>).<span class="pl-en">load</span>(<span class="pl-s1">url</span>)
          .<span class="pl-en">signature</span>(<span class="pl-k">new</span> <span class="pl-smi">LongVersionSignature</span>(<span class="pl-s1">pictureVersion</span>))
          .<span class="pl-en">listener</span>(<span class="pl-k">new</span> <span class="pl-smi">VisibilitySettingListener</span>&lt;<span class="pl-smi">Drawable</span>&gt;(<span class="pl-s1">borderLayout</span>))
          .<span class="pl-en">listener</span>(<span class="pl-k">new</span> <span class="pl-smi">TriggerLayoutNotifications</span>&lt;<span class="pl-smi">Drawable</span>&gt;())
          .<span class="pl-en">listener</span>(<span class="pl-k">new</span> <span class="pl-smi">LoggingListener</span>&lt;<span class="pl-smi">Drawable</span>&gt;())
          .<span class="pl-en">diskCacheStrategy</span>(<span class="pl-smi">DiskCacheStrategy</span>.<span class="pl-c1">ALL</span>)
          .<span class="pl-en">into</span>(<span class="pl-s1">image</span>);</pre></div>

<p dir="auto">No error - just the last Listener fires, the rest seems to be overwritten in the builder already.</p>

<p dir="auto">Change:<br>
RequestListener listener;
listener(RequestListener listener) {this.listener = listener; return this;}</p>
<p dir="auto">to</p>
<p dir="auto">List&lt;RequestListener&gt; listenerList = new ArrayList&lt;&gt;();
listener(RequestListener listener) {this.listenerList.add(listener); return this;}</p>
<p dir="auto">See: <a href="https://groups.google.com/d/topic/glidelibrary/auMdMEA7pw4/discussion" rel="nofollow">https://groups.google.com/d/topic/glidelibrary/auMdMEA7pw4/discussion</a></p>
<div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="return new Picasso.Builder(app)
        .listener(new Picasso.Listener() {
            @Override
            public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
                Log.e(e, &quot;Failed to load image: %s&quot;, uri);
            }
        })
        .build();"><pre class="notranslate"><span class="pl-k">return</span> <span class="pl-k">new</span> <span class="pl-smi">Picasso</span>.<span class="pl-smi">Builder</span>(<span class="pl-s1">app</span>)
        .<span class="pl-en">listener</span>(<span class="pl-k">new</span> <span class="pl-smi">Picasso</span>.<span class="pl-smi">Listener</span>() {
            <span class="pl-c1">@</span><span class="pl-c1">Override</span>
            <span class="pl-k">public</span> <span class="pl-smi">void</span> <span class="pl-en">onImageLoadFailed</span>(<span class="pl-smi">Picasso</span> <span class="pl-s1">picasso</span>, <span class="pl-smi">Uri</span> <span class="pl-s1">uri</span>, <span class="pl-smi">Exception</span> <span class="pl-s1">e</span>) {
                <span class="pl-smi">Log</span>.<span class="pl-en">e</span>(<span class="pl-s1">e</span>, <span class="pl-s">"Failed to load image: %s"</span>, <span class="pl-s1">uri</span>);
            }
        })
        .<span class="pl-en">build</span>();</pre></div>
<p dir="auto">I'm trying to replace the above block of picasso code. Picasso has a single location where we can listen for and log all errors, whereas Glide requires use to listen every place we request an image.  Enhancement request is to build a hook into glide where we can log all requests in a single place such as in the Builder or during configuration.</p>