android使用appache httpclient混淆后錯誤排除總結(jié)
引用出處:http://blog.csdn.net/chenrunhua/article/details/50054225
android上使用appache httpclient上傳文件時報一下錯誤:
[html]view plaincopy
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?org.apache.http.client.ClientProtocolException
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:756)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:519)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:497)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cloudapm.agent.android.instrumentation.HttpInstrumentation.execute(SourceFile:188)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.ecloud.netapi.a.m.a(SourceFile:130)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.ecloud.f.j.dY(SourceFile:160)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.e.dX(SourceFile:52)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.d.run(SourceFile:459)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.b.dS(SourceFile:316)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.b.a(SourceFile:14)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.c.run(SourceFile:62)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?java.lang.Thread.run(Thread.java:864)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:??Caused?by:?org.apache.http.client.NonRepeatableRequestException:?Cannot?retry?request?with?a?non-repeatable?request?entity
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:427)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:519)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:497)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cloudapm.agent.android.instrumentation.HttpInstrumentation.execute(SourceFile:188)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.ecloud.netapi.a.m.a(SourceFile:130)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.ecloud.f.j.dY(SourceFile:160)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.e.dX(SourceFile:52)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.d.run(SourceFile:459)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.b.dS(SourceFile:316)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.b.a(SourceFile:14)?
11-20?12:49:59.572?7360-22466/com.cn21.ecloud?D/d:?????at?com.cn21.android.b.c.run(SourceFile:62)?
代碼如下
[html]view plaincopy
RandomAccessFilefile=newRandomAccessFile(localFile,?"r");
//?僅上傳未完成的文件內(nèi)容
file.seek(status._size);
InternalFileStreamfs=newInternalFileStream(new?FileInputStream(
file.getFD()),?status._size,?observer);
InputStreamEntityentity=newInputStreamEntity(fs,?fileLength
-?status._size);
request.setEntity(entity);
DLog.d(TAG,"entity?is?repeatable???=?"?+?entity.isRepeatable());
DLog.write2File(TAG,?"entity?is?repeatable???=?"?+?entity.isRepeatable(),?DLog.LOG_PATH_TRANSFER);
if(ConstantConfig.DEBUG){
dumpRequest(request,?null);
}
try?{
HttpResponseresponse=mHttpClient.execute(request);
InternalFileStream是繼承FilterInputStream類汞舱,實現(xiàn)進度得回調(diào)梆掸;
問題的表現(xiàn):在混淆中购披,上傳文件時就會報這個問題;不混淆則一直沒有沒有問題;
解決:
1.一開始被這個問題領(lǐng)向錯誤的方向喷舀;因為是混淆出問題,不混淆則一直沒問題,所以在查混淆是否導(dǎo)致問題這個方向上:到最后添加了所有的類都不混淆的也不能解決問題
-keep class **{*;}
2.查看錯誤的log:貌似是NonRepeatableRequestException是不可重讀的問題茫虽,
用filebody不好替換;
3.用HttpURLConnection替換http client既们,最后報錯如下:
[html]view plaincopy
11-25?18:17:41.783?26180-26378/com.cn21.ecloud?D/e:?Release?UploadService:com.cn21.ecloud.netapi.a.m@24817145
11-25?18:17:41.783?26180-26378/com.cn21.ecloud?D/d:?Transfer?Ex
java.io.IOException:?File?descriptor?closed
at?libcore.io.Posix.readBytes(Native?Method)
at?libcore.io.Posix.read(Posix.java:147)
at?libcore.io.BlockGuardOs.read(BlockGuardOs.java:230)
at?libcore.io.IoBridge.read(IoBridge.java:472)
at?java.io.FileInputStream.read(FileInputStream.java:177)
at?java.io.DataInputStream.read(DataInputStream.java:63)
at?java.io.InputStream.read(InputStream.java:162)
at?java.io.DataInputStream.read(DataInputStream.java:59)
at?com.cn21.ecloud.netapi.a.m.a(SourceFile:145)
at?com.cn21.ecloud.f.j.dY(SourceFile:160)
at?com.cn21.android.b.e.dX(SourceFile:52)
at?com.cn21.android.b.d.run(SourceFile:459)
at?com.cn21.android.b.b.dS(SourceFile:316)
at?com.cn21.android.b.b.a(SourceFile:14)
at?com.cn21.android.b.c.run(SourceFile:62)
at?java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at?java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at?java.lang.Thread.run(Thread.java:818)
11-25?18:17:41.783?26180-26378/com.cn21.ecloud?D/transferLoop:?Transfer?task:20151124_111841.mp4?stopped
報文件無效問題濒析;
檢查文件的讀方面發(fā)現(xiàn)有個getFD(),獲取文件的通道啥纸;進入FileInputStream這個類構(gòu)造方法去發(fā)現(xiàn)這個stream流需要手動關(guān)閉:
[html]view plaincopy
/**
*?Constructs?a?new?{@code?FileInputStream}?that?reads?from?{@code?fd}.
*
*?@param?fd
*????????????the?FileDescriptor?from?which?this?stream?reads.
*?@throws?NullPointerException
*?????????????if?{@code?fd}?is?{@code?null}.
*/
public?FileInputStream(FileDescriptor?fd)?{
if?(fd==?null)?{
throw?new?NullPointerException("fd==?null");
}
this.fd=fd;
this.shouldClose=false;
//?Note?that?we?do?not?call?guard.open?here?because?the
//?FileDescriptor?is?not?owned?by?the?stream.
}
this.shouldClose = false;這個問題有點大号杏,因此需要最后文件上傳完再finally中關(guān)閉之前用RandomAccessFile打開的文件的句柄。
但是這個問題有點怪異斯棒,為什么不混淆時就不會出問題盾致?而在混淆過后才能爆出這個問題?
總結(jié):
最終問題的表面現(xiàn)在也許不是問題發(fā)生的根本原因荣暮;因為最后表現(xiàn)出來的問題可能是上一個問題引發(fā)的庭惜;因此需要往前面走點查查。