【发布时间】:2014-08-13 09:58:15
【问题描述】:
我正在覆盖 DefaultHttpClient,并将我的缓存机制作为 RequestInterceptor 和 ResponseInterceptor 传递
new DefaultHttpClient(new ThreadSafeClientConnManager(params, schemeRegistry), params) {
@Override
protected HttpRequestExecutor createRequestExecutor(){
return cache == null ? super.createRequestExecutor() : cache.createRequestExecutor();
}
@Override
protected BasicHttpProcessor createHttpProcessor() {
BasicHttpProcessor processor = super.createHttpProcessor();
if(null != cache){
processor.addRequestInterceptor(cache);
processor.addResponseInterceptor(cache);
}
return processor;
}
@Override
protected HttpContext createHttpContext() {
// Same as DefaultHttpClient.createHttpContext() minus the
// cookie store.
HttpContext context = new BasicHttpContext();
context.setAttribute(
ClientContext.AUTHSCHEME_REGISTRY,
getAuthSchemes());
context.setAttribute(
ClientContext.COOKIESPEC_REGISTRY,
getCookieSpecs());
context.setAttribute(
ClientContext.CREDS_PROVIDER,
getCredentialsProvider());
return context;
}
};
}
然后我处理响应:
private void processResponse(String requestLine, CachedItem item, HttpResponse response, HttpContext context){
... some code
switch(response.getStatusLine().getStatusCode()){
case HttpStatus.SC_NOT_MODIFIED:
Log.v(TAG, "processResponse, not modified");
updateResponseWithCachedFile(response);
break;
case HttpStatus.SC_OK:
Log.v(TAG, "processResponse, updating cache");
saveEntity(response);
break;
}
...some code
}
public synchronized void updateResponseWithCachedFile(HttpResponse response){
response.setStatusCode(HttpStatus.SC_OK);
response.setEntity(new FileEntity(new File(mCachedFilePath), "" /* it is internal, not used */));
}
public synchronized void saveEntity(final HttpResponse response){
try{
File cacheFile = new File(mCachedFilePath);
Utils.delete(TAG + " removing obsolete file", cacheFile);
if(Logger.assertIfFalse(cacheFile.createNewFile(), TAG, "failed to create file " + cacheFile)){
Files.copy(new InputSupplier<InputStream>() {
@Override
public InputStream getInput() throws IOException{
return response.getEntity().getContent();
}
}, cacheFile);
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
updateResponseWithCachedFile(response);
}
我的问题出在 Galaxy s5 上。 我得到一个例外:
07-29 21:00:57.227 28164 29824 W System.err: java.lang.ClassCastException: org.apache.http.entity.FileEntity 无法转换为 org.apache.http.entity.BasicHttpEntity 07-29 21:00:57.227 28164 29824 W System.err: at org.apache.http.impl.client.DefaultRequestDirector.executeSB(DefaultRequestDirector.java:880) 07-29 21:00:57.227 28164 29824 W System.err: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:675) 07-29 21:00:57.227 28164 29824 W System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:567) 07-29 21:00:57.227 28164 29824 W System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491) 07-29 21:00:57.227 28164 29824 W System.err: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469) 07-29 21:00:57.227 28164 29824 W System.err: at com.my_application.service.background.HttpRequest$1.run(HttpRequest.java:138) 07-29 21:00:57.227 28164 29824 W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 07-29 21:00:57.227 28164 29824 W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 07-29 21:00:57.227 28164 29824 W System.err: at java.lang.Thread.run(Thread.java:841)
在这里我看到了一个方法: org.apache.http.impl.client.DefaultRequestDirector.executeSB(DefaultRequestDirector.java:880)
我没有找到任何关于此的信息。 也许三星有自己的此类实现? 我没有 S5 在设备上运行它。 为什么我会收到此错误? 谢谢
【问题讨论】:
标签: java android apache http httpclient