java - Android:ThreadSafeClientConnManager 下载图像时出现错误

标签 java android thread-safety httpclient bugfender

对于我当前的应用程序,我从不同的“事件”中收集图像 供应商”在西类牙。

  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 下载图像时,我得到以下信息 日志输出:

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);

所以,我现在想知道为什么我的 ThreadSafeClientConnManager 与我的所有其他连接(主要是交换 JSONObjects)完美地工作(至少看起来是这样)但不是使用来自某些特定网站的图像(例如 salir.com - 对于大多数其他网站,它可以工作,但)。是否缺少 HTTP 参数?

我当前的设置是:

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:

现在,奇怪的是,它实际上确实与 ThreadSafeClientConnManager -有时- 一起工作。如果我连续几次尝试下载图像并对其进行解码,它可能会在 15-30 次试验后正常工作。很奇怪。

我希望有一个解决方案,因为我更喜欢使用 ThreadSafeClientConnManager 而不是 URLConnection


更新 3:

正如下面 Mike Mosher 所建议的,似乎通过使用 BufferedHttpEntity 解码错误 不再出现。但是现在,尽管比以前少了,但我得到了一个 SkImageDecoder::Factory returned null 错误。

最佳答案

斯特凡,

我遇到了同样的问题,在网上搜索也没找到。很多人都遇到过这个问题,但解决它的答案并不多。

我正在使用 URLConnection 获取图像,但我发现问题不在于下载,而是 BitmapFactory.decodeStream 在解码图像时出现问题。

我更改了我的代码以反射(reflect)您的原始代码(使用 httpRequest)。我做了一个更改,我在 http://groups.google.com/group/android-developers/browse_thread/thread/171b8bf35dbbed96/c3ec5f45436ceec8?lnk=raot 找到了(感谢 Nilesh)。您需要添加“BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);”

这是我之前的代码:

        conn = (HttpURLConnection) bitmapUrl.openConnection(); 
        conn.connect();
        is = conn.getInputStream();
        //bis = new BufferedInputStream(is);
        //bm = BitmapFactory.decodeStream(bis);
        bm = BitmapFactory.decodeStream(is);

她是有效的代码:

            HttpGet httpRequest = null;

    try {
        httpRequest = new HttpGet(bitmapUrl.toURI());
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

    HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);

        HttpEntity entity = response.getEntity();
        BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
        InputStream instream = bufHttpEntity.getContent();
        bm = BitmapFactory.decodeStream(instream);

正如我所说,我有一个页面下载了大约 40 张图片,您可以刷新以查看最新的照片。 “解码器->解码返回错误错误”,我几乎有一半会失败。使用上面的代码,我没有遇到任何问题。

谢谢

关于java - Android:ThreadSafeClientConnManager 下载图像时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1630258/

相关文章:

java - 无法在已检查的异常上回滚事务

android - ActionBar 中 Action /菜单项的动态控制

java - 移动/复制捕获的图像phonegap android中的问题

C++11:确保 GUI 调用是从主线程进行的

java - log4j2 StringMapMessage无法获取自定义消息

java - 任意长度的整数到二进制数组

android - 作为 "Private"(仅限本地)文件夹/文件选择器的存储访问框架?

java - 为什么在这种情况下不会发生死锁

ruby-on-rails - 以用户为单位设置Active Resource HTTP身份验证是否安全?

java - 服务帐户创建的文件夹不会出现在 Google Drive Web 应用程序中