эта статья от BEA (теперь оракул) является хорошей выставкой о том, как пойти об этом: http://www.oracle.com/technology/pub/articles/dev2arch/2006/11/effective-exceptions.html . Это отчасти принимает Java, но необходимо быть в состоянии использовать его для других сред также.
У меня была аналогичная проблема, и корень проблема была связана с тайм-аутом при запросе некоторых изображений. Я перешел на использование Загрузчика фоновых изображений , и с тех пор у меня не было проблем. Надеюсь, это поможет
Стефан,
У меня была такая же проблема, и я не нашел много информации в Интернете. Многие люди сталкивались с этой проблемой, но не получили много ответов, чтобы ее решить.
Я получал изображения с помощью 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 изображений, и вы можете обновить ее, чтобы увидеть самые свежие фотографии. Я бы почти потерпел неудачу с "декодером-> декодировать ложную ошибку". С приведенным выше кодом у меня не было проблем.
Спасибо
Я попробовал разные способы дерева, простое URLConnection, которое вы используете, и которое, кажется, работает на вас, как Майк Мошер использует, а также таким образом [http://asantoso.wordpress.com/2008/03/07/download-and-view-image-from-the-web/], все они приводят к тому, что декодированное изображение возвращается ложным.
КАК КАК, если я преобразую изображение в PNG, все способы работают отлично!!!! Однако я попробовал поместить изображения на мою рабочую ftp домашнюю страницу, и тогда все jpgs загружаются нормально с простым решением.... Так что по какой-то причине кажется, что если сервер не достаточно быстр, он разбирает jpg-файлы до того, как они на самом деле полностью загружены или что-то вроде того.
. Мое решение не в использовании 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.
У меня была точно такая же проблема при попытке декодировать изображение из байтового массива. После некоторых экспериментов решение, похоже, состоит в том, чтобы назначить временное хранилище в параметрах BitmapFactory. Попробуйте:
Options options = new Options();
options.inTempStorage = new byte[256];
Bitmap newMapBitmap = BitmapFactory.decodeStream(instream, null, options);
Если проблема не решается сразу, попробуйте увеличить размер временного массива. Я думаю, что большие файлы растровых изображений требуют большего буфера для декодирования.