1. 程式人生 > >Android6.0載入Xutils-2.6.14.jar出現retry error, curr request is null 解決辦法

Android6.0載入Xutils-2.6.14.jar出現retry error, curr request is null 解決辦法

先前專案的下載及網路請求用的是Xutils-2.6.5.jar包,這是因為公司系統基於4.4.4系統編譯依賴的JDk為1.6,較高版本無法使用。但是最近,因為系統版本升級為6.0,結果Xutils2.6.5的相容性不好的缺點就暴露出來了,一開始出現錯誤:

08-28 11:28:29.537: E/RetryHandler.retryRequest(L:91)(3703): retry error, curr request is null
08-28 11:28:29.547: E/zqh(3703): error = com.lidroid.xutils.exception.HttpException: java.io.IOException: stack size 1038KB
08-28 11:28:29.547: E/zqh(3703): msg = java.io.IOException: stack size 1038KB

在網上查詢答案,介紹說是換成2.6.14或者3以上的更新版本,後來我換成了2.6.14結果還是不行,出現錯誤:
08-28 16:40:49.736: E/RetryHandler.retryRequest(L:91)(2731): retry error, curr request is null
08-29 09:01:11.853: E/zqh(13777): error = com.lidroid.xutils.exception.HttpException: java.io.IOException: abstract method "void org.apache.http.HttpRequestInterceptor.process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)"
08-29 09:01:11.853: E/zqh(13777): msg = java.io.IOException: abstract method "void org.apache.http.HttpRequestInterceptor.process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)"

然後我就懷疑是不是org.apache jar包的問題,根據Android6.0之後HttpClient已經被取消,所以新增org.apache.http.legacy.jar包,進行測試,結果還是報錯:

08-29 09:40:02.120: E/RetryHandler.retryRequest(L:91)(26649): retry error, curr request is null
08-29 09:40:02.142: W/System.err(26649): com.lidroid.xutils.exception.HttpException: java.io.IOException: abstract method "void org.apache.http.HttpRequestInterceptor.process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)"
08-29 09:40:02.143: W/System.err(26649): 	at com.lidroid.xutils.http.HttpHandler.sendRequest(HttpHandler.java:147)
08-29 09:40:02.143: W/System.err(26649): 	at com.lidroid.xutils.http.HttpHandler.doInBackground(HttpHandler.java:176)
08-29 09:40:02.143: W/System.err(26649): 	at com.lidroid.xutils.http.HttpHandler.doInBackground(HttpHandler.java:1)
08-29 09:40:02.143: W/System.err(26649): 	at com.lidroid.xutils.task.PriorityAsyncTask$1.call(PriorityAsyncTask.java:67)
08-29 09:40:02.143: W/System.err(26649): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-29 09:40:02.143: W/System.err(26649): 	at com.lidroid.xutils.task.PriorityRunnable.run(PriorityRunnable.java:16)
08-29 09:40:02.143: W/System.err(26649): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
08-29 09:40:02.143: W/System.err(26649): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
08-29 09:40:02.143: W/System.err(26649): 	at java.lang.Thread.run(Thread.java:818)
08-29 09:40:02.144: W/System.err(26649): Caused by: java.io.IOException: abstract method "void org.apache.http.HttpRequestInterceptor.process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)"
08-29 09:40:02.144: W/System.err(26649): 	at com.lidroid.xutils.http.HttpHandler.sendRequest(HttpHandler.java:142)
08-29 09:40:02.144: W/System.err(26649): 	... 8 more
08-29 09:40:02.144: W/System.err(26649): Caused by: java.lang.AbstractMethodError: abstract method "void org.apache.http.HttpRequestInterceptor.process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)"
08-29 09:40:02.145: W/System.err(26649): 	at org.apache.http.protocol.BasicHttpProcessor.process(BasicHttpProcessor.java:295)
08-29 09:40:02.145: W/System.err(26649): 	at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:165)
08-29 09:40:02.145: W/System.err(26649): 	at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:414)
08-29 09:40:02.145: W/System.err(26649): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
08-29 09:40:02.145: W/System.err(26649): 	at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
08-29 09:40:02.145: W/System.err(26649): 	at com.lidroid.xutils.http.HttpHandler.sendRequest(HttpHandler.java:125)
08-29 09:40:02.145: W/System.err(26649): 	... 8 more

還是不行,最後,發現android6.0的Settings裡面的Android.mk檔案有這麼一行:
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
意味著,會採用混淆的模式即:本地jar包會混淆,所以程式在系統下編譯的時候在本地查詢org.apche的jar包時,沒有發現就會去載入6.0系統原帶的阿帕奇包,就出現了錯誤。

解決辦法:

proguard.flags檔案中新增#-dontwarn org.apache.**
-keep public class org.apache.** {*;}

就可以成功了。