Я решил это. Это была проблема устаревшего удаленного сервера с докером. Теперь, когда я работаю с новой версией (3.141.59), она работает нормально:
docker run -d -p 4445:4444 selenium/standalone-firefox:3.141.59-iron
Общий набросок решения заключается в использовании пользовательского Представления
, который запрашивает Фильм
, чтобы нарисовать себя на Canvas
] периодически.
Первым шагом является создание экземпляра Movie
. Существует фабрика под названием decodeStream
, которая может создавать фильм с учетом InputStream
, но этого недостаточно для использования потока из UrlConnection
. Если вы попробуете это, вы получите IOException
, когда загрузчик фильма попытается вызвать reset
в потоке. Хакер, каким бы неудачным он ни был, заключается в использовании отдельного BufferedInputStream
с установленной вручную меткой
, чтобы указать ему сохранить достаточно данных, которые сброс
не будет потерпеть поражение. К счастью, URLConnection
может сказать нам, сколько данных ожидать. Я считаю, что этот прием неудачен, потому что он фактически требует, чтобы все изображение было буферизовано в памяти (что не проблема для настольных приложений, но серьезная проблема для мобильного устройства с ограниченным объемом памяти).
Вот фрагмент код установки Movie
:
URL url = new URL(gifSource);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(conn.getContentLength());
Movie movie = Movie.decodeStream(bis);
bis.close();
Затем вам нужно создать представление, которое будет отображать этот Movie
. Подкласс View
с пользовательским onDraw
сделает свое дело (при условии, что у него есть доступ к Movie
, который вы создали с помощью предыдущего кода).
@Override protected void onDraw(Canvas canvas) {
if(movie != null) {
long now = android.os.SystemClock.uptimeMillis();
int dur = Math.max(movie.duration(), 1); // is it really animated?
int pos = (int)(now % dur);
movie.setTime(pos);
movie.draw(canvas, x, y);
}
}
view не запускается для перерисовки без посторонней помощи, а слепой вызов invalidate ()
в конце onDraw
- это просто трата энергии.
Вы пробовали BitmapDecode
?
Здесь есть пример в демоверсиях API здесь .