将webview内容保存到android存储并加载它

时间:2012-05-31 11:11:59

标签: android html webview storage

我想创建一个具有webview布局的android应用程序。这是我申请的标准:

  1. 第一次启动应用程序时,webview会加载一个网址(可能是facebook,google等等) webview.loadUrl( “http://www.google.com”);

  2. 加载网址后,应用程序会将加载的网址保存到Android内部存储中“特定位置”的HTML视图(file.htm)中。所以,假设我打开“google.com”,该应用程序将谷歌的网页保存为HTML文件(假设文件名为“google.htm”),当我转到“特定地点”并点击“谷歌”时.htm“文件,它使用Android的HTML查看器显示谷歌网页。

  3. 当应用程序再次启动时,或者只是说应用程序再次加载网址时(在本例中为“google.com”),它不会从“google.com”页面获取,但它取自内部存储android上的“google.htm”文件。因此,从用户的角度来看,该应用程序仍然可以加载网页,即使它没有连接到互联网。

  4. 为了简单起见,

    1. 申请开始 - >转到指定的网址 - >检查存储
    2. 如果存在指定的URL,则存储中的HTML文件,然后从存储
    3. 加载
    4. ELSE从网站加载网址。
    5. 任何人都可以帮我解释代码和解释吗?对此,我真的非常感激。谢谢你们:D

1 个答案:

答案 0 :(得分:5)

您可以使用WebView的Javascript界面​​在页面加载完成后返回整个HTML源代码。为此,您需要将自己的WebViewClient分配给WebView。

为此,请在Activity类中使用类似于以下内容的内容 - 确保您的Activity实现Observer

public void onCreate(Bundle savedInstanceState) {
    // ...

    webView.setWebViewClient(new MyWebViewClient());
    HtmlJSInterface htmlJSInterface = new HtmlJSInterface();
    webView.addJavascriptInterface(htmlJSInterface, "HTMLOUT");
    htmlJSInterface.addObserver(this);

    // ...
}

// Called when our JavaScript Interface Observables are updated.
@Override
public void update(Observable observable, Object observation) {

    // Got full page source.
    if (observable instanceof HtmlJSInterface) {
        html = (String) observation;
        onHtmlChanged();
    }
}

private void onHtmlChanged() {
    // Do stuff here...
}

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        // When each page is finished we're going to inject our custom
        // JavaScript which allows us to
        // communicate to the JS Interfaces. Responsible for sending full
        // HTML over to the
        // HtmlJSInterface...
        isStarted = false;
        isLoaded = true;
        timeoutTimer.cancel();
        view.loadUrl("javascript:(function() { "
                + "window.HTMLOUT.setHtml('<html>'+"
                + "document.getElementsByTagName('html')[0].innerHTML+'</html>');})();");
        }
    }
}

然后,您将要创建HtmlJSInterface类,如下所示:

   public class HtmlJSInterface extends Observable {
  private String html;

  /**
   * @return The most recent HTML received by the interface
   */
  public String getHtml() {
    return this.html;
  }

  /**
   * Sets most recent HTML and notifies observers.
   * 
   * @param html
   *          The full HTML of a page
   */
  public void setHtml(String html) {
    this.html = html;
    setChanged();
    notifyObservers(html);
  }
}