【问题标题】:Android WebView WebArchive freeze after loadingAndroid WebView WebArchive 加载后冻结
【发布时间】:2019-01-31 01:21:00
【问题描述】:

我目前正在为平板电脑开发一个 android 应用程序,我想介绍以下用例:“如果没有互联网连接,我希望应用程序正常运行”。

我使用 web 视图在应用中加载调查,因此一旦安装在我们的商店中,每次我们需要进行新的改造或添加问题时,我都不必安装新版本。

为了覆盖没有连接的情况,我保存了一个 webArchive,当我需要加载网页时,如果没有 wifi,我会加载它。

private void setMainView() {
    mainview = (WebView) findViewById(R.id.wvMain);

    WebSettings webSettings = mainview.getSettings();
    webSettings.setLightTouchEnabled(true);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this);
    mainview.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");

    if (DetectConnection.checkInternetConnection(this)){
        mainview.setWebViewClient(new WebViewClient() {

            public void onPageFinished(WebView view, String url) {
                File webpage = new File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM).getAbsolutePath()+  File.separator +"home.mht");

                mainview.saveWebArchive(webpage.toString());
                editor.putString(BuildConfig.HOME_PAGE_WEB_ARCHIVE_FILE,webpage.toString() );
                editor.commit();
            }
        });


        mainview.loadUrl(BuildConfig.SERVER_URL + BuildConfig.HOME_PAGE);
    }
    else{
        String filename = getSharedPreferences(BuildConfig.PREFERENCES_NAME, 0).getString(BuildConfig.HOME_PAGE_WEB_ARCHIVE_FILE,null);
        mainview.setWebChromeClient(new WebChromeClient());
        mainview.loadUrl("file:///"+filename);

    }
}    

唯一的问题是 webarchive 一加载就冻结了。我尝试了很多方法让它起作用,但解决方案让我失望了。

当我将应用程序设置为平面模式并重新加载应用程序时,我看到主页正常,但点击事件不起作用。我的 Android Javascript 界面也无法正常工作,因为我测试了在应用程序完成加载时发送 Toast 进行调试,所以我猜测 javascript 在我的 webarchive 中不起作用,或者 webarchive 可能不包括来自其他的 CSS 和 Javascript W3.css 和 JQuery 之类的网站?

如果我使用这些资产的本地版本,它们可能会包含在网络存档中。

欢迎提出任何建议。

谢谢

【问题讨论】:

    标签: javascript android webview webarchive


    【解决方案1】:

    我最终使用了我的 webview 的缓存,而不是加载 web 存档。

    我首先在我的网页的根目录中添加了一个 cache.appcache,将我的主页链接到它。

    <html manifest="cache.appcache">
    

    在根目录 (www/http_doc) 我添加了这个文件:

    CACHE MANIFEST
    /home
    /thank-you
    /css/w3.css
    /js/jquery-3.3.1.min.js
    /images/happy1.png
    /images/happy2.png
    /favicon.ico
    
    #NETWORK
    NETWORK:
    /home
    /thank-you
    
    #FALLBACK
    FALLBACK:
    /home /offline.html
    /thank-you /offline_thankyou.html
    

    如果网络可用,则允许有一个 html 文件的后备部分。然后我激活了我的 webview 的缓存:

    WebSettings webSettings = mainview.getSettings();
    webSettings.setAppCacheEnabled(true);
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
    webSettings.setAppCachePath(
             getApplicationContext().getCacheDir().getAbsolutePath());
    

    现在,我每次修改文件“cache.appcache”并重新加载应用程序,它都会复制当前的“offline.html”文件并根据缓存重新加载一个工作站点。幸好我有一个非常静态的网站可供加载,因此它在没有互联网连接的情况下 100% 正常运行。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多