Android: Ошибка с ThreadSafeClientConnManager, загружающим изображения

эта статья от BEA (теперь оракул) является хорошей выставкой о том, как пойти об этом: http://www.oracle.com/technology/pub/articles/dev2arch/2006/11/effective-exceptions.html . Это отчасти принимает Java, но необходимо быть в состоянии использовать его для других сред также.

13
задан znq 22 May 2016 в 03:35
поделиться

5 ответов

У меня была аналогичная проблема, и корень проблема была связана с тайм-аутом при запросе некоторых изображений. Я перешел на использование Загрузчика фоновых изображений , и с тех пор у меня не было проблем. Надеюсь, это поможет

0
ответ дан 1 December 2019 в 19:02
поделиться

Стефан,

У меня была такая же проблема, и я не нашел много информации в Интернете. Многие люди сталкивались с этой проблемой, но не получили много ответов, чтобы ее решить.

Я получал изображения с помощью URLConnection, но обнаружил, что проблема не в загрузке, но у BitmapFactory.decodeStream возникла проблема с декодированием изображения.

Я изменил свой код, чтобы отразить ваш исходный код (используя 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 изображений, и вы можете обновить ее, чтобы увидеть самые свежие фотографии. Я бы почти потерпел неудачу с "декодером-> декодировать ложную ошибку". С приведенным выше кодом у меня не было проблем.

Спасибо

27
ответ дан 1 December 2019 в 19:02
поделиться

Я попробовал разные способы дерева, простое URLConnection, которое вы используете, и которое, кажется, работает на вас, как Майк Мошер использует, а также таким образом [http://asantoso.wordpress.com/2008/03/07/download-and-view-image-from-the-web/], все они приводят к тому, что декодированное изображение возвращается ложным.

КАК КАК, если я преобразую изображение в PNG, все способы работают отлично!!!! Однако я попробовал поместить изображения на мою рабочую ftp домашнюю страницу, и тогда все jpgs загружаются нормально с простым решением.... Так что по какой-то причине кажется, что если сервер не достаточно быстр, он разбирает jpg-файлы до того, как они на самом деле полностью загружены или что-то вроде того.

.
0
ответ дан 1 December 2019 в 19:02
поделиться

Мое решение не в использовании BitmapFactory.DeCodeStream () Причина, как я смотрю на него, он использует декодер Skia, и иногда кажется видом ошибочно. Вы можете попробовать что-то вроде этого.

    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 (......){

   }        

И для функции копирования ()

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

и IO_BUFFER_SIZE - постоянное целое число со значением 4 * 1024.

5
ответ дан 1 December 2019 в 19:02
поделиться

У меня была точно такая же проблема при попытке декодировать изображение из байтового массива. После некоторых экспериментов решение, похоже, состоит в том, чтобы назначить временное хранилище в параметрах BitmapFactory. Попробуйте:

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

Если проблема не решается сразу, попробуйте увеличить размер временного массива. Я думаю, что большие файлы растровых изображений требуют большего буфера для декодирования.

0
ответ дан 1 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: