先前项目的下载及网络请求用的是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.** {*;}
就可以成功了。