安卓 WebView - 第一次LoadData()正常工作,随后的调用无法更新显示

20
在第一次调用LoadData()后,事件onLoadResource会像预期的那样触发,并且显示正常。接下来,当我使用LoadData()刷新屏幕以显示新页面时,第二次调用LoadData()页面不会更新,onLoadResource()也不会触发。
第二次调用LoadData()只会触发onPageFinished,而onPageStarted从不触发!
一个解决方法是在LoadData()之后调用.reload(),但这会在activity中的其他逻辑过程中引起各种问题。
为什么LoadData()不能多次使用?
我使用的是非常简单的HTML,既然使用.reload()可以使它正常工作,我的LoadData()语句似乎不是问题所在。
有任何想法都会很有帮助,先行致谢。
7个回答

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

它运行良好。loaddata在下一次加载数据时不会刷新。


1
有人能解释一下为什么这个有效吗?在KitKat上调用loadData两次也可以,但是这个解决方案看起来至少不像一个hack。 - Rodney
嗯...我一定是漏了什么,但是出现的只是一个带有“数据”字样的空白页面。 - rikkitikkitumbo
没有理由。 - Mr.G

16

由于某些原因,您首先需要清除内容。 "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");

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确实帮了我。谢谢! - Hrishikesh Kadam

1
您需要在主线程中使用loadDataWithBaseURL来加载数据。

添加一些说明,让OP了解这将如何帮助他解决问题。 - ρяσѕρєя K

-1
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");

-1

我能够通过每次给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();
     }
   } 
 } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接