Android WebView - 1st LoadData() работает нормально, последующие вызовы не обновляются

После первого вызова функции LoadData() событие onLoadResource срабатывает, как и должно быть, и дисплей в порядке. Затем я хочу обновить экран с помощью новой страницы, когда я использую LoadData() во второй раз, когда страница не обновляется, а onLoadResource() НЕ ПОЖАРАЕТ.

Затем второй вызов LoadData() onlyfires onPageFinished... onPageStarted никогда не срабатывает!

Обходной задачей было вызвать .reload() после LoadData(), но это вызывает всевозможные проблемы во время другой логики в активности.

Почему функция LoadData() работает несколько раз?

Я использую чрезвычайно простой HTML, и поскольку использование .reload() заставляет его работать, мой оператор LoadData(), похоже, не является проблемой.

Любые идеи были бы полезны, TIA

Ответы

Ответ 1

Использование

webview.loadDataWithBaseURL("same://ur/l/tat/does/not/work", "data", "text/html", "utf-8", null);

он отлично работает. loaddata не обновляется в следующий раз при загрузке данных.

Ответ 2

По какой-то причине вы должны сначала очистить контент. Методы "load...", похоже, явно не добавляют их содержимое, но это не работает. Я думаю, что это было WebView.clearView(), но это было устарело. Документ для устаревшего метода на веб-сайте Android фактически говорит вам использовать WebView.loadUrl("about:blank") в качестве замены для этого метода. Так что...

WebView.loadUrl("about:blank");
WebView.loadData(data, mime, encoding);

... делает трюк для меня. Кажется, немного грязно, но я бы не осмелился нарушить Google! Я не уверен, что кто-то еще это делает, но я просто загружаю строку, которую я прочитал из "актива". Я использую его для отображения справки. Поэтому я не использую никаких реальных URL-адресов; Я просто использую WebView как средство визуализации HTML.

Примечание. Для тех новичков (вроде меня только около месяца назад) обязательно замените "WebView" экземпляром вашей переменной. Это не статические методы.

Ответ 3

Такой подход будет работать

webView.loadDataWithBaseURL("fake-url", "<html></html>", "text/html", "UTF-8", null);
webView.loadData(htmlBuilder.toString(), "text/html", "UTF-8");

Ответ 4

Те, у кого все еще есть проблема, я нашел быстрое решение, просто использую обработчик для этого

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", null);
        }
    }, 10) ;

Ответ 5

Вам нужно загрузитьDataWithBaseURL в основной поток

Ответ 6

Мне удалось обновить браузер при каждом обновлении, каждый раз указывая html-документ на другой идентификатор: см. ниже в //WEBVIEW.

package com.example.scroll;
// philip r brenan at gmail.com, www.appaapps.com 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;

public class MainActivity extends Activity
 {protected void onCreate(Bundle savedInstanceState)
   {super.onCreate(savedInstanceState);
    setContentView(new MyWebView(this)); 
   }
  class MyWebView extends WebView 
   {MyWebView(Context Context)
     {super(Context);
      getSettings().setJavaScriptEnabled(true);
      addJavascriptInterface(this, "Android");   
      new Thread()
       {public void run()
         {for(int j = 0; j < 100; ++j)
           {post(new Runnable()
             {public void run()
               {loadData(content(), "text/html", "utf-8"); // Display in browser
               }
             });    
            try {Thread.sleep(5000);} catch(Exception e) {}
           }  
         }
       }.start();
     } 
    int c = 0, C = 1;
    String content() 
     {final StringBuilder s = new StringBuilder();
      //s.append("<html id="+(C++)+"><body>"); // WEBVIEW REFRESHES CORRECTLY *************** 
      s.append("<html><body>");              // WEBVIEW DOES NOT REFRESH ******************

      s.append("<h1 id=11>1111</h1>");
      s.append("<script>location.href = '#22';</script>");
      for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c;

      s.append("<h1 id=22>2222</h1>");
      for(int i = 0; i < 10; ++i) s.append("<p>"+c+c+c); ++c;
      Log.e("AAAAAA", "content="+s.toString());
      s.append("</body></html>");
      return s.toString();
     }
   } 
 } 

Ответ 7

String urlUnique = String.format("http://%s", java.util.UUID.randomUUID().toString());
                    webView.loadDataWithBaseURL(urlUnique, "<html></html>", "text/html", "UTF-8", null);
                    Thread.sleep(200);
                    webView.loadData(htmlData, "text/html", "UTF-8");