Подтвердить что ты не робот

WebView loadUrl работает только один раз

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 - я попытался отключить их, но я не удалял библиотеки, поэтому я не уверен, что они не являются виновник.

Любые идеи?

4b9b3361

Ответ 1

Используйте точную последовательность ниже.

   wv.clearCache(true);
   wv.clearView();
   wv.reload();
   wv.loadUrl("about:blank");
   wv.loadData(Constants.BLOG_URL);

Ответ 2

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

Я не совсем уверен, что это сработает, но, возможно, заменит этот код:

public void reLoadUrl() {
    wv.loadUrl(Constants.BLOG_URL);

}

с помощью этого кода:

public void reLoadUrl() {

    wv.clearView();
    wv.loadUrl(Constants.BLOG_URL);

}

возможно, когда вы очистите WebView, он решит проблему

Ответ 3

Я предлагаю вам попробовать воссоздать 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);

Это могут быть другие свойства, которые вам нужно восстановить, но что общая идея.

Ответ 4

Попробуйте загрузить пустую страницу:

wv.loadUrl("about:blank");
wv.clearHistory();
wv.clearView();
wv.loadUrl(Constants.BLOG_URL);

Изменить: Это код, который я использовал раньше, потому что у меня были проблемы с этим, пожалуйста, попробуйте.

Ответ 5

Попробуйте настроить клиента WebChrome. Веб-просмотр нуждается в поддержке WebChrome Clint для правильной работы в некоторых случаях.

wv.setWebChromeClient(new WebChromeClient());

Ответ 6

@override
public void onFormResubmission(WebView view, Message dontResend, Message resend){
   resend.sendToTarget();
}

Ответ 7

Просто создайте метод, в котором вы очистите повторный инициализацию всего 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();
}

Ответ 8

Я столкнулся с той же проблемой и получил ее работу, выполнив следующие шаги:

webView.clearCache(true);
webView.loadUrl("Url");

и я получил многократный URL-адрес, загруженный успешно.

Ответ 9

Я столкнулся с той же проблемой и, наконец, смог решить эту проблему. Я новичок в 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).

Ответ 10

У меня была такая же проблема, вызвав resumeTimers() решил проблему для меня...

Ответ 11

В onCreate вместо wv.loadUrl(Constants.BLOG_URL); просто используйте wv.loadDataWithBaseURL(baseUrl, readFileAsString("index.html") , mimeType, "UTF-8", null);

Ответ 12

Я столкнулся с той же проблемой. Я каждый раз создавал новый Webview. Просто сначала уничтожьте свой предыдущий webView перед созданием нового. Надеюсь, эта помощь! Сделайте свой веб-просмотр глобальной переменной. Как -

Webview w;

то перед созданием нового веб-обозревателя просто уничтожьте предыдущий

                if(null != w)
                {
                    //destroy the previous webview, before creating the new one
                    w.destroy();
                }
                w= new WebView(activity);

Ответ 13

Вызвать этот метод в 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) {

            }
        }

Ответ 14

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

webView.loadUrl( "javascript:window.location.reload( true )" );

Также для WebView необходимо включить JavaScript:

webView.getSettings().setJavaScriptEnabled(true);