【问题标题】:org.apache.http.impl.client.DefaultRequestDirector method executeSB (Galaxy S5)org.apache.http.impl.client.DefaultRequestDirector 方法 executeSB (Galaxy S5)
【发布时间】: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


    【解决方案1】:

    我不确定这是否会对您有所帮助,并且我怀疑您在这段时间之后是否仍在寻求帮助,但也许其他人会发现这很有用。我发现 Apache HTTP 在 S5 特别是 Verizon S5 上似乎不是很可靠。我在尝试在 Android 应用程序上使用 Restlet 客户端连接到 JSON 服务器时遇到了这个问题。我不断收到与本地主机的连接错误,就像我试图连接到远程服务器一样奇怪。

    长时间的反复试验使我相信三星正在覆盖或提供他们自己的低级别 Apache HTTP 实现,因为使用 Restlet 内部连接器并且不提供任何其他更改可以解决问题。它似乎与某些软件更新有关,因为恢复出厂设置将允许 Apache HTTP 在再次停止工作之前工作一小段时间。看看其他人是否遇到这个问题会很有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多