Android WebView - 第一个 LoadData() 工作正常,后续调用不更新显示

Posted

技术标签:

【中文标题】Android WebView - 第一个 LoadData() 工作正常,后续调用不更新显示【英文标题】:Android WebView - 1st LoadData() works fine, subsequent calls do not update display 【发布时间】:2011-05-05 01:13:21 【问题描述】:

在第一次调用 LoadData() 之后,onLoadResource 事件按原样触发,并且显示正常。接下来我想用新页面刷新屏幕,当我第二次使用 LoadData() 页面没有更新并且 onLoadResource() 不会触发时。

然后第二次调用 LoadData() 只会触发 onPageFinished ... onPageStarted 永远不会触发!

一种解决方法是在 LoadData() 之后调用 .reload() ,但这会在活动中的其他逻辑期间导致各种问题。

为什么 LoadData() 不能多次工作?

我使用的是极其简单的 html,并且由于使用 .reload() 使其工作,我的 LoadData() 语句似乎不是问题。

任何想法都会有所帮助,TIA

【问题讨论】:

【参考方案1】:

使用

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

它工作正常。 loaddata 下次加载数据时不会刷新。

【讨论】:

有人解释了为什么会这样吗?也调用 loadData 两次也有效(无论如何在 KitKat 上),但这个解决方案至少看起来不像是 hack 嗯...我一定遗漏了什么,但出现的只是一个空白页,上面写着“数据”一词 原因。【参考方案2】:

出于某种原因,您必须先清除内容。 “加载...”方法似乎没有明确附加它们的内容,但它不起作用。我认为它曾经是WebView.clearView(),但已被弃用。 android site 上已弃用方法的文档实际上告诉您使用 WebView.loadUrl("about:blank") 作为该方法的替代品。所以...

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

...对我有用。看起来有点脏,但我不敢违抗谷歌!我不确定是否有其他人在这样做,但我只是在加载我从“资产”中读取的字符串。我用它来显示帮助文档。所以我没有使用任何实际的 URL;我只是将 WebView 用作 HTML 渲染器。

注意:对于那些新手(大约一个月前像我一样),请确保将“WebView”替换为您的变量实例。这些不是静态方法。

【讨论】:

【参考方案3】:

那些仍然有问题的人我找到了一个快速的解决方案,只需使用处理程序即可

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

【讨论】:

在 UI 线程上调用 webView.loadDataWithBaseURL 确实帮助了我。谢谢!【参考方案4】:

这样的方法会奏效

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

【讨论】:

【参考方案5】:

您需要在主线程

中加载DataWithBaseURL

【讨论】:

添加一些解释这将如何帮助 OP 解决问题【参考方案6】:

通过每次为 html 文档赋予不同的 ID,我能够在每次更新时刷新浏览器:请参见下面的 // 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");

【讨论】:

以上是关于Android WebView - 第一个 LoadData() 工作正常,后续调用不更新显示的主要内容,如果未能解决你的问题,请参考以下文章

如果第一个 URL 不存在于 android webView 中,则加载第二个 URL

Android WebView - 第一个 LoadData() 工作正常,后续调用不更新显示

在android应用程序的webview中加载url时启动画面

Android WebView 文本框确认密码第二个获取焦点后设置不能自动放大

带有 2 个按钮的 Android 主要活动可在 webview 中打开第二个活动

Android WebView 触摸事件链接