Android: ThreadSafeClientConnManager 下载图片的错误
对于我当前的应用程序,我从西班牙的不同“事件提供商”收集图像。
Bitmap bmp=null;
HttpGet httpRequest = new HttpGet(strURL);
long t = System.currentTimeMillis();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
Log.i(TAG, "Image ["+ strURL + "] fetched in [" + (System.currentTimeMillis()-t) + "ms]");
HttpEntity entity = response.getEntity();
InputStream instream = entity.getContent();
bmp = BitmapFactory.decodeStream(instream);
return bmp;
但是,从 salir.com 下载图像时,我得到以下logcat输出:
13970 Gallery_Activity I Fetching image 2/8 URL: http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
13970 skia D --- decoder->decode returned false
搜索该错误消息并未提供太多有用的结果。
有人知道问题可能是什么吗?
谢谢!
更新 1:
在询问了更多内容并测试了不同的东西之后,我发现问题似乎出在其他地方。即使我的logcat输出说
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
getContentLength(): 93288
这是图像的正确长度(以字节为单位),似乎流或HTTP连接有问题。
我的原始代码(上图)正在利用ThreadSafeClientConnManager。如果我用一个简单的词替换它,它就能完美地工作:URLConnection
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);
所以,我现在想知道为什么我的工作与我所有其他联系(主要是交换)完美无缺(至少看起来是这样),而不是来自某些特定网站的图像(例如 salir.com - 对于大多数其他网站来说,它的工作原理,虽然)。是否有我缺少的 HTTP 参数?ThreadSafeClientConnManager
JSONObjects
我目前的设置是:
HttpParams parameters = new BasicHttpParams();
HttpProtocolParams.setVersion(parameters, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(parameters, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(parameters, false); // some webservers have problems if this is set to true
ConnManagerParams.setMaxTotalConnections(parameters, MAX_TOTAL_CONNECTIONS);
HttpConnectionParams.setConnectionTimeout(parameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(parameters, SOCKET_TIMEOUT);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), HTTP_PORT));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
DefaultHttpClient http_client = new DefaultHttpClient(conMgr, parameters);
更新 2:
现在,奇怪的是,它实际上确实与 -有时 - 一起工作。如果我一直尝试下载图像并连续几次解码它,它可能会在15-30次试用后工作。很奇怪。ThreadSafeClientConnManager
我希望有一个解决方案,因为我更喜欢使用而不是.ThreadSafeClientConnManager
URLConnection
更新 3:
正如Mike Mosher在下面所建议的那样,通过使用BufferedHttpEntity,解码错误似乎不再出现。然而现在,即使比以前更少,我也得到了一个错误。SkImageDecoder::Factory returned null