English 中文(简体)
Anders: Bug with ThreadSafeClientConnManager, 下载图像
原标题:Android: Bug with ThreadSafeClientConnManager downloading images
  • 时间:2009-10-27 11:41:28
  •  标签:

For my current application I collect images from different "event providers" in Spain.

  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;

However, when downloading images from salir.com I get the following logcat output:

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

对这一错误信息进行搜索,并没有带来非常有益的结果。

谁认为问题是什么?

Gracias!


<><>Update 1:

我在多问一线并测试不同的缺陷后,发现问题似乎在其他地方。 尽管我的原木目录产出说,

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://developer.android.com/vis/org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager.html“rel=” ThreadSafeClientConnManager。 如果我只用一个简单的<代码>URLConnection加以替换,则它完全运作:

URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);

因此,我现在要问一下,为什么我的<编码>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);

<><>上>

现在奇怪的是,它实际上与<代码”合作。 ThreadSafeClientConnManager-sometimes-。 如果我不断试图下载图像,并在一行中分两度加以脱节,那么在15至30次审判之后,我可能会工作。 非常奇怪。

我希望能找到解决办法,因为我倾向于使用<代码>。 ThreadSafeClientConnManager und


<><>Update 3:

如Mike Mosher下文所述,似乎通过。 http://www.emdecoding误差 似乎没有。 然而,现在,即使比以前少,我还是收到一份<代码>SkImageDecoder:Factory 退回无效/编码错误。

问题回答

Stefan,

我也曾有过同样的问题,没有发现对互联网的搜索。 许多人已经存在这一问题,但不是解决问题的答案。

我正在使用URLConnection的图像,但我发现,下载中的问题并不在于,但比特图Factory.decodeStream正在出现贬低图像的问题。

我修改了我的法典,以反映你原来的法典(使用http://Request)。 I made one change, which I found at :http://groups.google.com/group/android-developers/browse_thread/thread/171b8bfd35bbed96/c35ecf454363ecc8? (比克尼罗什) 您需要添加“BufferedHttpEntity bufHttpEntity = 新的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个图像的网页,你可以重新看到最新的照片。 我几乎一半的失败是“decoder->decode退回错误错误”。 根据上述法典,我没有问题。

增 编

我的解决办法不是使用<代码>。 BimapFactory.decodeStream() 造成我看病的方式,它使用SKIA decoder,有时似乎是不规则的。 你可以尝试这样的东西。

    Bitmap bitmap = null;
    InputStream in = null;
    BufferedOutputStream out = null;
    try {
            in = new BufferedInputStream(new URL(url).openStream(),
                     IO_BUFFER_SIZE);

            final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
            out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
            copy(in, out);
            out.flush();

            final byte[] data = dataStream.toByteArray();
            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);


   } catch (......){

   }        

页: 1

private static void copy(InputStream in, OutputStream out) throws IOException {
    byte[] b = new byte[IO_BUFFER_SIZE];
    int read;
    while ((read = in.read(b)) != -1) {
        out.write(b, 0, read);
    }
}

www.un.org/french/ga/president

还试图增加这一选择。

opt.inPurgeable = true;
HttpGet httpRequest = null;
try {
  httpRequest = new HttpGet(url);
} catch (Exception 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();
Bitmap bm = BitmapFactory.decodeStream(instream);

我也存在同样的问题,其根源在于在要求某些图像时没有时间。 我转而使用Background Value Loader,此后没有问题。 希望这一帮助

我在试图从一阵列中抹去图像时遇到同样的问题。 在进行了一些试验之后,解决办法似乎是在“BimapFactory”的备选办法中分配一些温室储存。 Try:

Options options = new Options();
options.inTempStorage = new byte[256];
Bitmap newMapBitmap = BitmapFactory.decodeStream(instream, null, options);

如果问题得不到直接解决,则试图增加温带的规模。 我认为,大块地块的档案需要一个更大的缓冲来进行脱钩。

设定缺省缓冲办法确实有助于解决有关比特马库奇的一些记忆问题,但肯定不会涵盖所有这些问题。 根本问题似乎是在检索轨道图或比图标标时的某种时间范围。 现在,我写上下游的字眼,然后把温文档交给正在做罚款的BitmapFactory。

HttpURLConnection hConn = null;
        hConn = openHttpConnection(szUrl);

        hConn.setRequestMethod("GET");  
        hConn.setRequestProperty("User-Agent",szUserAgent);
        hConn.setRequestProperty("Accept",szAccept);
        hConn.setRequestProperty("Accept-Charset",szCharset);

        hConn.setInstanceFollowRedirects(true);
        hConn.setUseCaches(true);
        hConn.setChunkedStreamingMode(8*1024);
        hConn.setDoInput(true);
        hConn.setConnectTimeout(60*1000);
        hConn.setReadTimeout(60*1000);
        hConn.connect();


        InputStream bmpIs = hConn.getInputStream();
        BufferedInputStream bmpBis = new BufferedInputStream(bmpIs); 
        Bitmap bmpThumb = null;

        BitmapFactory.Options bfOpt = new BitmapFactory.Options();

        bfOpt.inScaled = true;
        bfOpt.inSampleSize = 2;
        bfOpt.inPurgeable = true;

        bmpThumb = BitmapFactory.decodeStream(bmpBis,null,bfOpt);

        if(bmpThumb == null)
        {
            for(int i=0; i<10; i++)
            {
                Thread.sleep(200);
                System.gc();

                bmpThumb = BitmapFactory.decodeStream(bmpBis,null,bfOpt);


                if(bmpThumb == null)
                    bfOpt.inSampleSize += 1;
                else
                    break;
            }
        }




相关问题
热门标签