- Предотвращение кэширования данных Android WebView
- 2 ответов
- Отключить кеширование на Android для WebApps
- Первое решение
- Второе решение
- Однопоточность в Android WebView
- Предыстория
- Кэширование в WebView
- Однопоточность WebView
- Вывод
- Оптимизация производительности WebView в Android
- Android Webview-полностью очистить кэш
- 7 ответов
Предотвращение кэширования данных Android WebView
можно ли запретить WebView кэшировать данные в /data/data/. / кэш / webViewCache? Я установил следующее На WebSettings, но папка кэша все еще используется:
Я заметил, что файлы кэша удаляются при выходе из приложения или когда приложение уходит в фоновый режим, но я бы предпочел, чтобы они вообще не создавались. Кроме того, я хотел бы предотвратить использование webview.db & webviewCache.БД найдено в /data / data/. /база данных. I в настоящее время удалите базы данных следующим образом:
это, по-видимому, имеет желаемый эффект, и файлы, похоже, не будут воссозданы снова для использования. Можно ли с уверенностью предположить, что это так?
2 ответов
заметки на этой странице заставляют меня поверить, что они не хотят, чтобы у вас был прекрасный доступ к кешу:
насколько я могу судить, есть (по крайней мере) два способа хранения кэша. Я не написал ничего из этого в приложении, поэтому никаких гарантий:
(1) каждый раз, когда ваш WebView заканчивает страницу, очистить кэш. Что-то подобное в вашем WebViewClient:
(2) Если вам все равно, что хранится, но просто хотите получить последний контент, вы можете достичь этого, установив правильные HTTP-заголовки на loadUrl (очевидно, вы хотите проверить это на своем сервере). Кроме того, это доступно только для Android API 8+
возможно, вы пробовали это, но, возможно, также установите размер кэша WebView на что-то маленькое. Я не уверен, что 0 будет работать, поэтому, возможно, 1:
в моем приложении (на Android 4.2.2) я загружаю на webview веб-страницу с изображениями, которые я могу изменить во время выполнения (я заменяю изображения, сохраняя путь). Решение Матта (1)
работает для меня, решение (2) нет! Ура!—2—>
Источник
Отключить кеширование на Android для WebApps
Честно говоря, я не уверен, должен ли я опубликовать это на SO; В любом случае, давайте помогаем друг другу.
На данный момент я создаю веб-приложение, которое я регулярно проверяю на своем Android-телефоне. Вместо того, чтобы загружать его в Phonegap или что-то все время, я настроил простую страницу с iFrame, указывая на содержимое веб-приложения (размещенное в сети).
Плохо: для того, чтобы увидеть изменения, я должен очистить кэш приложений. Else, «предыдущая» версия все еще отображается (потому что она застряла в кеше).
Итак, я надеялся, что есть возможность включить / выключить Android / Configure на странице, которая отключает кеширование для ВСЕХ объектов и файлов?
Большое спасибо, ребята!
Дать представление о том, как я работаю.
Существует два способа отключить кеширование в приложениях Cordova / Phonegap.
- Во-первых, настройка параметров веб-просмотра при загрузке содержимого.
- Второй – добавляет значение метки времени на ваш URL-адрес каждый раз, когда вы хотите обновить страницу. Скорее всего, это обходной путь.
Я опишу оба варианта в деталях.
Первое решение
Для новой версии Кордовы (5.3.3)
Добавьте ниже импорт
Для более старых версий Кордовы
Предполагая, что вы загружаете свой контент в свой класс Activity .
Вы можете настроить свой веб-просмотр, пока он загружен в вашем классе Activity.
Вот пример фрагмента кода, который вы можете понять, как отключить кеширование браузера в приложениях Phonegap/Cordova .
Как вы можете видеть, этот блок кода будет загружать контент всякий раз, когда onResume() событие onResume() , что означает, что ваш веб-контент будет перезагружен всякий раз, когда ваше приложение находится на переднем плане.
Следующая часть кода предотвращает кеширование в веб-просмотре.
Второе решение
Это решение действительно глупо, но ведет себя так, как ожидалось. Для вашей ситуации это может быть полезно.
Вы можете просто добавить значение timestamp в конце URL. Вот пример фрагмента кода.
Он добавляет значение timestamp в конце вашего URL-адреса каждый раз и загружает контент, поскольку он новый.
Это два способа избежать кеширования в веб-приложениях в Phonegap/Cordova .
Источник
Однопоточность в Android WebView
Предыстория
При разработке мобильного приложения для крупной международной компании возникла необходимость отобразить Web страничку в WebView. Страница на Java Script и содержит DOM контент порядка 10-15 Мб. В связи с большим размером страница загружается порядка 30 — 50 секунд, в зависимости от интернет соединения. Такие результаты не радовали, поэтому возникла необходимость тщательного исследования данной проблемы.
Кэширование в WebView
Единственным найденным решением было использование кэширования для загружаемого контента:
Скорость загрузки увеличилась вдвое. Однако, для поддержания актуальности контента, WebView проверяет каждый файл в отдельности на его валидность. Хоть скорость и выросла, время загрузки данной страницы внутри WebView по сравнению с мобильным браузером Chrome уступало в несколько раз.
Однопоточность WebView
После тщательного исследования пришел к выводу, что WebView использует всего один поток для загрузки данных. Это верно как для WebView построенном на собственном WebKit (SDK =19). Chrome в отличии от WebView использует много потоков (число зависит от процессора) и не использует в себе WebView. Поэтому сравнивать WebView с Chrome тоже самое, что сравнивать запорожец с Lamborghini, нет смысла. Разработчики нативного компонента Cromium для WebView не предполагают внедрение многопоточности и считают, что один поток гарантирует стабильную работу.
Не будем забывать, что платформа ориентированна на использование в таких целях сторонних приложений, которые пользователь сам выбрал за какие то свои качества.
Но в рамках моего проекта это не устраивало заказчика. Поэтому было принято решение оставить WebView со всеми его недостатками. Предварительно мне пришлось доказать, что другие крупные проекты так же не будут оперативно работать с исходной страницей:
1. Twitter отказался открывать страницу и сразу предложил использовать браузер.
2. Facebook предложил использовать браузер, но все равно открыл страницу в WebView с такой же скоростью, что и мое решение.
К счастью этого было достаточно и на меня прекратилось давление.
Вывод
Не стоит использовать WebView для отображения больших и сложных страниц. Рекомендованное использование WebView:
1. Для авторизации на каких либо сервисах.
2. Для отображения простых страниц.
3. Для выравнивания текста по ширине (Стандартное TextView не имеет данной функции, но это уже совсем другая история).
Не будем забывать, что в Android используется система Intent, благодаря который мы можем использовать сторонние браузеры, скорость которых заметно выше.
Источник
Оптимизация производительности WebView в Android
В этом материале мы поговорим о том как можно улучшить быстродействие (роизводительность) вашего приложения, игры, которая написана на HTML+CSS+JS и с помощью метода WebView запилена в Андроид.
Любая игра да и современное приложение тоже как известно требуют довольно гладких плавных анимаций (скроллы, появление списка со стороны и тд). Но вот по поводу анимаций в HTML на андроид возникало и возникает по сей день множество споров и неотвеченных вопросов в интернете. Сегодня мы постараемся немного помочь советами как оптимизировать ваше приложение или игру на Андроид написанную на HTML.
1. Используйте CSS анимацию. О том почему и зачем вы прочитаете здесь, где был обзор HTML технологий доставки анимации клиенту.
2. Проверьте валидность вёрстки и убедитесь что все тэги закрыты и всё стоит по своим местам.
3. Оптимизируйте Javascript код в вашем приложении/игре. Если у вас всё завязано на нём, тогда его оптимизация даст вам хороший прирост производительности. Вы можете найти в интернете статьи ою этом. Пока предлагаю только на английском ( раз и два ). Найдёте хорошие на русском — в комменты!
4. Попытаемся на нативном уровне Андроида что-нибудь придумать:
4.1. Там где вы объявляете Webview можно добавить
Сами Андроид Девелоперы первый параметр не считают очень успешным появился и кажется действует только в API 19 (Могу ошибаться).
4.2. В манифест в ваше активити можно добавить опцию:
Эта опция призвана делать добро оптимизиции и хардверно ускорять работу что должно плавно сказываться на анимации. Должно. На самом деле этот параметр очень неоднозначен у некоторых он даёт прирост производительности, а у некоторых наоборот всё портит. С техничекого плана данная опция принудительно впускает в процесс обработки всего что происходит на экране мощи видеокарты. Не всегда удаётся как хочется. Именно поэтому нашлись умники, которые копнули это поглубже и как оказалось GPU акселлерация не способна улучшить CSS/JS, поэтому в файл с основной Активити добавляют:
if (Build.VERSION.SDK_INT >= 11) <
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
>
Он вроде как бы отключает на самом WebView акселлерацию и говорят конечной производительность идёт в плюс.
Некоторые предлагают использовать:
Но по сути этот та же акселлерация. От которой как мы уже поняли в WebView лучше избавиться.
4.3. Попробуйте добавить следующий CSS-код слоям, спискам и пр, что участвует в анимации:
-webkit-transform: translate3d(0,0,0);
-webkit-backface-visibility: hidden;
-webkit-perspective: 1000;
-webkit-transform-style: flat;
Некоторым это помогает сделать анимацию более гладкой. В основном бывает достаточно использовать:
transform: translate3d(0,0,0);
-webkit-transform: translate3d(0,0,0);
Уверенно включит 3D акселерацию следующий код:
-webkit-transform: translate3d(0,0,0);
-webkit-transform: tranlsateZ(0);
-webkit-transform: scale3d(1,1,1);
-webkit-transform: scale3dZ(1);
Но самое главное не злоупотребите этим. Как оно помогает так оно и может навредить. Добавляйте это свойство только в элементы, которые анимируются.
4.4. Если у вас многое завязано на плавности скролла, то некоторые предлагают использовать вместо стандартного класса WebView этот:
import android.content.Context;
import android.view.MotionEvent;
import android.webkit.WebView;
public class MyWebView extends WebView<
public MyWebView(Context context) <
super(context);
// TODO Auto-generated constructor stub
>
private long lastMoveEventTime = -1;
private int eventTimeInterval = 40;
@Override
public boolean onTouchEvent(MotionEvent ev) <
long eventTime = ev.getEventTime();
int action = ev.getAction();
switch (action) <
case MotionEvent.ACTION_MOVE: <
if ((eventTime — lastMoveEventTime) > eventTimeInterval) <
lastMoveEventTime = eventTime;
return super.onTouchEvent(ev);
>
break;
>
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP: <
return super.onTouchEvent(ev);
>
>
return true;
>
>
Код рассчитан на заимодействие одним пальцем, для двух и больше (мультитач) придётся немного допилить.
5. Не используйте ни в коем случае событие onclick на странице, поскольку это даёт тормоза длинной порядка 300ms. А это разве есть хорошо?
Вместо этого используйте ontouchstart (на элемент нажали, выполняется событие,палец убрали), а если нужно чтобы был именно клик по элементу (на элемент нажали, палец убрали, выполняется событие) тогда напишите по быстрому комбо-обработчик ontouchstart+ontouchend.
6. Не используйте большое DOM древо в коде. Оптимально будет если глубина вложений не будет длиннее 3. Например body > div > ul > li (body естественно не считается в этом числе).
7. Люди советуют в построении HTML страницы приложения и игры использовать там где возможно абсолютные позиции, а также пиксели вместо процентов. Это каким-то образом напрямую связано с обработкой контента CPU и GPU.
8. Могут появляться тормоза если вы не отключили стандартное действие на touch событие. При чём на девайсах от Samsung может вообще останавливаться вся анимация на странице после свайпа или длительного удержания.
Чтобы отключить это, используйте jQuery (можно маленькую min библиотеку) в которых есть event.preventDefault() и event.stopPropagation() которые как раз и предотвращают стандартные обработки событий. Вместо них советовали использовать return false, но что-то не удалось. Итак, вот что нужно добавить в JS код вашего приложения или игры:
document.addEventListener(‘touchstart’, function(event) <
event.preventDefault();
event.stopPropagation();
/* Здесь ваш код обработки события*/
>, false);
document.addEventListener(‘touchmove’, function(event) <
event.preventDefault();
event.stopPropagation();
/* Здесь ваш код обработки события*/
>, false);
document.addEventListener(‘touchend’, function(event) <
event.preventDefault();
event.stopPropagation();
/* Здесь ваш код обработки события*/
>, false);
9. Старайтесь не использовать большие изображения подгоняя их потом под все размеры. Сделайте лучше для каждого разрешения свой размер. Для этого можно воспользоваться CSS Media Queries. Помните что
На этом пожалуй всё. Если у вас есть чем дополнить статью — пишите в комментарии. Если вы согласны со способом (или он вам помог) описанным в коментариях — голосуйте.
Источник
Android Webview-полностью очистить кэш
у меня есть WebView в одном из моих действий, и когда он загружает веб-страницу, страница собирает некоторые фоновые данные из Facebook.
то, что я вижу, хотя, страница, отображаемая в приложении, одинакова при каждом открытии и обновлении приложения.
Я попытался настроить WebView не использовать кэш и очистить кэш и историю WebView.
Я также следовал предложению здесь:Как очистить кэш на Объект WebView?
но ничего из этого не работает, у кого-нибудь есть идеи как я могу преодолеть эту проблему, потому что это жизненно важная часть моего заявления.
поэтому я реализовал первое предложение (хотя изменил код, чтобы быть рекурсивным)
однако это все еще не изменило то, что отображается на странице. В моем настольном браузере я получаю другой html-код на веб-страницу, созданную в WebView, поэтому я знаю, что WebView должен кэшироваться где-то.
на IRC-канале мне указали на исправление для удаления кэширования из URL-соединения, но пока не видно, как применить его к WebView.
Если я удалю свое приложение и переустановлю его, я смогу обновить веб-страницу, т. е. не кэшированную версию. Основная проблема заключается в том, что изменения вносятся в ссылки на веб-странице, поэтому передняя часть веб-страницы полностью не изменяется.
7 ответов
отредактированный фрагмент кода выше, опубликованный Gaunt Face, содержит ошибку в том, что если каталог не удается удалить, потому что один из его файлов не может быть удален, код будет продолжать повторную попытку в бесконечном цикле. Я переписал его, чтобы быть действительно рекурсивным, и добавил параметр numDays, чтобы вы могли контролировать, сколько лет должны быть файлы, которые обрезаны:
надеюсь, пригодится другим людям:)
Я нашел еще элегантное и простое решение для очистки кэша
Я пытался выяснить, как очистить кэш, но все, что мы могли сделать из вышеупомянутых методов, это удалить локальные файлы, но он никогда не очищает ОЗУ.
API clearCache, освобождает ОЗУ, используемую webview, и, следовательно, санкционирует, что страница снова загружается.
Я нашел исправление, которое вы искали:
по какой-то причине Android делает плохой кэш url, который он продолжает возвращать случайно вместо новых данных, которые вам нужны. Конечно, вы можете просто удалить записи из БД, но в моем случае я пытаюсь получить доступ только к одному URL-адресу, поэтому сдуть всю БД проще.
и не волнуйтесь, эти DBs просто связаны с вашим приложением, поэтому вы не очищаете кэш всего телефона.
чтобы очистить все кэши webview во время выхода из приложения:
для Lollipop и выше:
Это должно очистить кэш приложений, который должен быть там, где ваш кэш webview
очистить историю, просто:
убедитесь, что вы используете метод ниже, чтобы данные формы не отображались как autopop при нажатии на поля ввода.
Источник