@@ -71,7 +71,8 @@ public final class ProgressManager {
7171 public static final String OKHTTP_PACKAGE_NAME = "okhttp3.OkHttpClient" ;
7272 public static final boolean DEPENDENCY_OKHTTP ;
7373 public static final int DEFAULT_REFRESH_TIME = 150 ;
74- public static final String IDENTIFICATION_NUMBER = "$JessYan$" ;
74+ public static final String IDENTIFICATION_NUMBER = "?JessYan=" ;
75+ public static final String IDENTIFICATION_HEADER = "JessYan" ;
7576
7677
7778 static {
@@ -191,10 +192,14 @@ public OkHttpClient.Builder with(OkHttpClient.Builder builder) {
191192 * @return
192193 */
193194 public Request wrapRequestBody (Request request ) {
194- if (request == null || request . body () == null )
195+ if (request == null )
195196 return request ;
196197
197198 String key = request .url ().toString ();
199+ request = pruneIdentification (key , request );
200+
201+ if (request .body () == null )
202+ return request ;
198203 if (mRequestListeners .containsKey (key )) {
199204 List <ProgressListener > listeners = mRequestListeners .get (key );
200205 return request .newBuilder ()
@@ -204,6 +209,16 @@ public Request wrapRequestBody(Request request) {
204209 return request ;
205210 }
206211
212+ private Request pruneIdentification (String url , Request request ) {
213+ boolean needPrune = url .contains (IDENTIFICATION_NUMBER );
214+ if (!needPrune )
215+ return request ;
216+ return request .newBuilder ()
217+ .url (url .substring (0 , url .indexOf (IDENTIFICATION_NUMBER )))
218+ .header (IDENTIFICATION_HEADER , url )
219+ .build ();
220+ }
221+
207222 /**
208223 * 将 {@link Response} 传入,配置一些本框架需要的参数,常用于自定义 {@link Interceptor}
209224 * 如已使用 {@link ProgressManager#with(OkHttpClient.Builder)},就不会用到此方法
@@ -212,16 +227,23 @@ public Request wrapRequestBody(Request request) {
212227 * @return
213228 */
214229 public Response wrapResponseBody (Response response ) {
215- if (response == null || response . body () == null )
230+ if (response == null )
216231 return response ;
217232
233+ String key = response .request ().url ().toString ();
234+ if (!TextUtils .isEmpty (response .request ().header (IDENTIFICATION_HEADER ))) {
235+ key = response .request ().header (IDENTIFICATION_HEADER );
236+ }
237+
218238 if (haveRedirect (response )) {
219- resolveRedirect (mRequestListeners , response );
220- resolveRedirect (mResponseListeners , response );
239+ resolveRedirect (mRequestListeners , response , key );
240+ resolveRedirect (mResponseListeners , response , key );
221241 return response ;
222242 }
223243
224- String key = response .request ().url ().toString ();
244+ if (response .body () == null )
245+ return response ;
246+
225247 if (mResponseListeners .containsKey (key )) {
226248 List <ProgressListener > listeners = mResponseListeners .get (key );
227249 return response .newBuilder ()
@@ -248,7 +270,7 @@ public Response wrapResponseBody(Response response) {
248270 * @return 加入了时间戳的新的 {@code url}
249271 */
250272 public String addDiffResponseListenerOnSameUrl (String originUrl , ProgressListener listener ) {
251- return addDiffResponseListenerOnSameUrl (originUrl , String .valueOf (SystemClock .elapsedRealtime ()), listener );
273+ return addDiffResponseListenerOnSameUrl (originUrl , String .valueOf (SystemClock .elapsedRealtime () + listener . hashCode () ), listener );
252274 }
253275
254276 /**
@@ -264,6 +286,7 @@ public String addDiffResponseListenerOnSameUrl(String originUrl, ProgressListene
264286 * <p>
265287 * Example usage:
266288 * <pre> {@code
289+ *
267290 * String newUrl = ProgressManager.getInstance().addDiffResponseListenerOnSameUrl(DOWNLOAD_URL, "id", getDownloadListener());
268291 * new Thread(new Runnable() {
269292 * @Override
@@ -276,11 +299,12 @@ public String addDiffResponseListenerOnSameUrl(String originUrl, ProgressListene
276299 * Response response = mOkHttpClient.newCall(request).execute();
277300 * } catch (IOException e) {
278301 * e.printStackTrace();
279- * //当外部发生错误时,使用此方法可以通知所有监听器的 onError 方法
280- * ProgressManager.getInstance().notifyOnErorr(DOWNLOAD_URL , e);
302+ * //当外部发生错误时,使用此方法可以通知所有监听器的 onError 方法,这里也要使用 newUrl
303+ * ProgressManager.getInstance().notifyOnErorr(newUrl , e);
281304 * }
282305 * }
283306 * }).start();
307+ *
284308 * } </pre>
285309 *
286310 * @param originUrl {@code originUrl} 作为基础并结合 {@code key} 用于生成新的 {@code url} 作为标识符
@@ -311,7 +335,7 @@ public String addDiffResponseListenerOnSameUrl(String originUrl, String key, Pro
311335 * @return 加入了时间戳的新的 {@code url}
312336 */
313337 public String addDiffRequestListenerOnSameUrl (String originUrl , ProgressListener listener ) {
314- return addDiffRequestListenerOnSameUrl (originUrl , String .valueOf (SystemClock .elapsedRealtime ()), listener );
338+ return addDiffRequestListenerOnSameUrl (originUrl , String .valueOf (SystemClock .elapsedRealtime () + listener . hashCode () ), listener );
315339 }
316340
317341
@@ -328,6 +352,7 @@ public String addDiffRequestListenerOnSameUrl(String originUrl, ProgressListener
328352 * <p>
329353 * Example usage:
330354 * <pre> {@code
355+ *
331356 * String newUrl = ProgressManager.getInstance().addDiffRequestListenerOnSameUrl(UPLOAD_URL, "id", getUploadListener());
332357 * new Thread(new Runnable() {
333358 * @Override
@@ -343,11 +368,12 @@ public String addDiffRequestListenerOnSameUrl(String originUrl, ProgressListener
343368 * Response response = mOkHttpClient.newCall(request).execute();
344369 * } catch (IOException e) {
345370 * e.printStackTrace();
346- * //当外部发生错误时,使用此方法可以通知所有监听器的 onError 方法
347- * ProgressManager.getInstance().notifyOnErorr(DOWNLOAD_URL , e);
371+ * //当外部发生错误时,使用此方法可以通知所有监听器的 onError 方法,这里也要使用 newUrl
372+ * ProgressManager.getInstance().notifyOnErorr(newUrl , e);
348373 * }
349374 * }
350375 * }).start();
376+ *
351377 * } </pre>
352378 *
353379 * @param originUrl {@code originUrl} 作为基础并结合 {@code key} 用于生成新的 {@code url} 作为标识符
@@ -368,7 +394,7 @@ public String addDiffRequestListenerOnSameUrl(String originUrl, String key, Prog
368394 * @return
369395 */
370396 private boolean haveRedirect (Response response ) {
371- String status = response .header ( "Status" );
397+ String status = String . valueOf ( response .code () );
372398 if (TextUtils .isEmpty (status ))
373399 return false ;
374400 if (status .contains ("301" ) || status .contains ("302" ) || status .contains ("303" ) || status .contains ("307" )) {
@@ -382,14 +408,23 @@ private boolean haveRedirect(Response response) {
382408 *
383409 * @param map {@link #mRequestListeners} 或者 {@link #mResponseListeners}
384410 * @param response 原始的 {@link Response}
411+ * @param url {@code url} 地址
385412 */
386- private void resolveRedirect (Map <String , List <ProgressListener >> map , Response response ) {
387- String url = response .request ().url ().toString ();
413+ private void resolveRedirect (Map <String , List <ProgressListener >> map , Response response , String url ) {
388414 List <ProgressListener > progressListeners = map .get (url ); //查看此重定向 url ,是否已经注册过监听器
389- if (progressListeners != null ) {
415+ if (progressListeners != null && progressListeners . size () > 0 ) {
390416 String location = response .header ("Location" );// 重定向地址
391- if (!TextUtils .isEmpty (location ) && !map .containsKey (location )) {
392- map .put (location , progressListeners ); //将需要重定向地址的监听器,提供给重定向地址,保证重定向后也可以监听进度
417+ if (!TextUtils .isEmpty (location )) {
418+ if (!map .containsKey (location )) {
419+ map .put (location , progressListeners ); //将需要重定向地址的监听器,提供给重定向地址,保证重定向后也可以监听进度
420+ } else {
421+ List <ProgressListener > locationListener = map .get (location );
422+ for (ProgressListener listener : progressListeners ) {
423+ if (!locationListener .contains (listener )) {
424+ locationListener .add (listener );
425+ }
426+ }
427+ }
393428 }
394429 }
395430 }
0 commit comments