Ответ 1
Используйте точную последовательность ниже.
wv.clearCache(true);
wv.clearView();
wv.reload();
wv.loadUrl("about:blank");
wv.loadData(Constants.BLOG_URL);
EDIT: Я работал над этим проектом много лет назад, и, к сожалению, я не могу проверить, работает ли какой-либо из ответов в данном сценарии.
Мне нелегко работать с одним WebView, который должен показывать наш блог. Когда он инициализирован, он работает отлично. Пользователь может перемещаться по различным ссылкам в WebView. Чтобы вернуться в блог, есть кнопка за пределами WebView, которая должна снова загрузить основной сайт блога.
Проблема заключается в том, что после второго вызова loadUrl ничего не загружается. Вот мой код:
private WebView wv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.blog);
wv = (WebView) findViewById(R.id.blog_webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon {
MyLog.logDump("onPageStarted: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
MyLog.logDump("onPageFinished: " + url);
}
});
wv.loadUrl(Constants.BLOG_URL);
}
Функция, вызываемая моим OnClickListener, следующая:
public void reLoadUrl() {
wv.loadUrl(Constants.BLOG_URL);
}
Но, несмотря на то, что журналы inPageFinished и onPageStarted показывают, что мой wv.loadUrl вызывается и что он загружает правильный URL-адрес, содержимое в веб-обозревателе не изменяется. Я попытался очистить кеш, историю, представление, пробовал разные WebSettings, пытался использовать webView.goBack() - не результат. Также эти идеи не работают: Странная проблема с веб-браузером goBack в android
Иногда reLoadUrl показывает желаемый результат - но как только он терпит неудачу, его больше нельзя заставить работать снова. Любые идеи, что может произойти? Я попытался прочитать код WebView, но я не мог найти ничего, что могло бы мне помочь.
Единственное, что я могу добавить, это то, что мы используем некоторые рекламные сети, которые сильно зависят от webViews - я попытался отключить их, но я не удалял библиотеки, поэтому я не уверен, что они не являются виновник.
Любые идеи?
Используйте точную последовательность ниже.
wv.clearCache(true);
wv.clearView();
wv.reload();
wv.loadUrl("about:blank");
wv.loadData(Constants.BLOG_URL);
Я провел последний день или около того, работая над приложением, использующим WebView. У меня было несколько проблем с загрузкой данных в WebView.
Я не совсем уверен, что это сработает, но, возможно, заменит этот код:
public void reLoadUrl() {
wv.loadUrl(Constants.BLOG_URL);
}
с помощью этого кода:
public void reLoadUrl() {
wv.clearView();
wv.loadUrl(Constants.BLOG_URL);
}
возможно, когда вы очистите WebView, он решит проблему
Я предлагаю вам попробовать воссоздать WebView
каждый раз, когда вы его используете, и посмотреть, не имеет значения.
Сначала сохраните контекст, макеты parms и parent.
Context context = wb.getContext();
ViewGroup.LayoutParams lp = wv.getLayoutParams();
ViewGroup parent = (ViewGroup)wv.getParent();
Затем остановите загрузку и удалите представление из своего родителя.
wv.stopLoading();
parent.removeView(wv);
Затем заново создайте и добавьте его обратно.
wv = new WebView(context);
parent.addView(wv, lp);
Это могут быть другие свойства, которые вам нужно восстановить, но что общая идея.
Попробуйте загрузить пустую страницу:
wv.loadUrl("about:blank");
wv.clearHistory();
wv.clearView();
wv.loadUrl(Constants.BLOG_URL);
Изменить: Это код, который я использовал раньше, потому что у меня были проблемы с этим, пожалуйста, попробуйте.
Попробуйте настроить клиента WebChrome. Веб-просмотр нуждается в поддержке WebChrome Clint для правильной работы в некоторых случаях.
wv.setWebChromeClient(new WebChromeClient());
@override
public void onFormResubmission(WebView view, Message dontResend, Message resend){
resend.sendToTarget();
}
Просто создайте метод, в котором вы очистите повторный инициализацию всего WebView и вызовите его из reLoadUrl().
void loadWebView() {
wv = (WebView) findViewById(R.id.blog_webview);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon {
MyLog.logDump("onPageStarted: " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
MyLog.logDump("onPageFinished: " + url);
}
});
wv.loadUrl(Constants.BLOG_URL);
}
public void reLoadUrl() {
loadWebView();
}
Я столкнулся с той же проблемой и получил ее работу, выполнив следующие шаги:
webView.clearCache(true);
webView.loadUrl("Url");
и я получил многократный URL-адрес, загруженный успешно.
Я столкнулся с той же проблемой и, наконец, смог решить эту проблему. Я новичок в android, не уверен, что это хорошо или плохо, но он работает для меня. Я просто очищаю catch от веб-представления и уничтожаю и воссоздаю перед перезагрузкой другой URL.
mWebView.clearCache(true);
// destroy before reload new url
parentView.removeView(mWebView);
mWebView.clearHistory();
mWebView.destroy();
Хотя mWebView.destroy(); генерировать ошибку "java.lang.Throwable: Ошибка: WebView.destroy() вызывается, пока он все еще подключен!" и я ищу его, но не получаю никакого решения, и многие говорят, что он не влияет на приложение до сих пор (я до сих пор не знаю, как решить эту проблему: я использую WebChromeClient).
У меня была такая же проблема, вызвав resumeTimers() решил проблему для меня...
В onCreate
вместо wv.loadUrl(Constants.BLOG_URL);
просто используйте wv.loadDataWithBaseURL(baseUrl, readFileAsString("index.html") , mimeType, "UTF-8", null);
Я столкнулся с той же проблемой. Я каждый раз создавал новый Webview. Просто сначала уничтожьте свой предыдущий webView перед созданием нового. Надеюсь, эта помощь! Сделайте свой веб-просмотр глобальной переменной. Как -
Webview w;
то перед созданием нового веб-обозревателя просто уничтожьте предыдущий
if(null != w)
{
//destroy the previous webview, before creating the new one
w.destroy();
}
w= new WebView(activity);
Вызвать этот метод в onPause()
private void pauseWebView() {
try {
Class.forName("android.webkit.WebView")
.getMethod("onPause", (Class[]) null)
.invoke(webview, (Object[]) null);
} catch(ClassNotFoundException cnfe) {
} catch(NoSuchMethodException nsme) {
} catch(InvocationTargetException ite) {
} catch (IllegalAccessException iae) {
}
}
Я столкнулся с той же проблемой, и ни одно из вышеперечисленных решений не работало для меня. Поэтому я исправил его, перезагрузив WebView с помощью JavaScript следующим образом:
webView.loadUrl( "javascript:window.location.reload( true )" );
Также для WebView необходимо включить JavaScript:
webView.getSettings().setJavaScriptEnabled(true);