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

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

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

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

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

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

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

【问题讨论】:

    标签: android loaddata


    【解决方案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");
          

          【讨论】:

            猜你喜欢
            • 2016-10-15
            • 2015-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-30
            • 2018-01-22
            相关资源
            最近更新 更多