[英]org.apache.http.impl.client.CloseableHttpClient Proxy Authentication
[英]org.apache.http.impl.client.DefaultRequestDirector method executeSB (Galaxy S5)
我重寫DefaultHttpClient,並通過Cache機制作為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系統。錯誤:位於org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:491)07-29 21:00:57.227 28164 29824 W系統。錯誤:在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:469)07-29 21:00:57.227 28164 29824 W系統錯誤:在com.my_application.service.background.HttpRequest $ 1。運行(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在設備上運行它。 為什么會出現此錯誤? 謝謝
我不確定這是否會對您有所幫助,並且我懷疑您在這段時間過后仍在尋求幫助,但是也許其他人會覺得有用。 我發現Apache HTTP在S5特別是Verizon S5上似乎不太可靠。 嘗試在Android應用程序上使用Restlet客戶端連接到JSON服務器時遇到此問題。 自從我嘗試連接到遠程服務器以來,我不斷收到與本地主機的連接錯誤,異常奇怪。
漫長的試驗和錯誤過程使我相信,由於使用Restlet內部連接器,而沒有提供其他更改來解決此問題,三星將在較低級別上覆蓋或提供其自己的Apache HTTP實現。 它似乎與某些軟件更新有關,因為恢復出廠設置將使Apache HTTP在短時間內工作,然后再停止工作。 看看是否還有其他人遇到此問題會很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.