【问题标题】:how to load or retrieve a webpage in both online and offline mode in android application?如何在android应用程序中以在线和离线模式加载或检索网页?
【发布时间】:2016-02-28 04:34:30
【问题描述】:

我需要在 Android 设备的内部或外部存储器中加载和检索 HTML 网页。我需要的是使用 web-view 在 android 中下载和检索网页。

有很多类似于下载或保存网页的重复问题。但是没有一个答案对我有帮助。指导我!

提前致谢。

【问题讨论】:

  • 你试过这个设置 viewer.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT) 到 webview 吗?

标签: android html webview offline-caching android-external-storage


【解决方案1】:

我不知道这个解决方案是否适合您。如果您想在离线模式和在线模式中查看网站,您可以使用网络爬虫从网站获取所有数据。Here 是 android 的示例项目网络爬虫。之后,您可以根据您的互联网可用性从 url 或本地内存加载网站。

【讨论】:

    【解决方案2】:

    Get the HTML code from loaded WebView

    Save String as html file android

    通过以上两个链接,您可以实现您的要求, 您可以将 html 内容存储到文件中,然后存储到内部存储中,然后您可以在离线模式下加载。

    【讨论】:

      【解决方案3】:

      WebView 可以加载和渲染remotelocal html 页面,此外它还支持'data' scheme URL

      Storage Options

      共享首选项(在您的情况下没有用)

      将私有原始数据存储在键值对中。

      内部存储(推荐用于您的情况)

      将私有数据存储在设备内存中。

      外部存储(您可以在您的情况下使用,但不推荐)

      将公共数据存储在共享的外部存储上。

      SQLite 数据库(您可以在您的情况下使用,但不推荐)

      将结构化数据存储在私有数据库中。

      网络连接(您可以在您的情况下使用,但不能在离线模式下工作)

      使用您自己的网络服务器将数据存储在网络上。

      【讨论】:

        【解决方案4】:

        您可能想尝试使用WebViewClientshouldInterceptRequest 方法,该方法使用设置为您的WebView。它允许您了解在 html 加载过程中加载的所有资源。所以你可以这样做:

        WebViewClient webViewClient = new WebViewClient() {
            @TargetApi(VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                WebResourceResponse response = null;
                if ("GET".equals(request.getMethod())) {
                    try {
                        response = getWebResponse(view.getContext().getApplicationContext(), request.getUrl().toString());
                    } catch (Exception e) {
                        Log.e(TAG, "Error while overriding getting web response", e);
                    }
                }
                return response;
            }
        
            @SuppressWarnings("deprecation")
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                WebResourceResponse response = null;
                try {
                    response = getWebResponse(view.getContext().getApplicationContext(), url);
                } catch (Exception e) {
                    Log.e(TAG, "Error while overriding getting web response", e);
                }
                return response;
            }
        
            WebResourceResponse getWebResponse(Context context, String url) {
                // YOUR IMPLEMENTATION that will save resource located at passed url
            }
        }
        webView.setWebViewClient(webViewClient);
        

        【讨论】:

          【解决方案5】:

          将网页保存到缓存中;

          WebView webView = new WebView( context );
          webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
          webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
          webView.getSettings().setAllowFileAccess( true );
          webView.getSettings().setAppCacheEnabled( true );
          webView.getSettings().setJavaScriptEnabled( true );
          webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default
          

          查看此链接WebView load website when online, load local file when offline

          【讨论】:

            【解决方案6】:

            对我来说,这听起来像是一个简单的 webview 缓存机制。

            试试这个

              WebView webView = new WebView( context );
            webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
            webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
            webView.getSettings().setAllowFileAccess( true );
            webView.getSettings().setAppCacheEnabled( true );
            webView.getSettings().setJavaScriptEnabled( true );
            webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default
            
            if ( !isNetworkAvailable() ) { // loading offline
                webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
            }
            

            isNetworkAvailable() 方法检查活动的网络连接:

            private boolean isNetworkAvailable() {
                ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService( CONNECTIVITY_SERVICE );
                NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
                return activeNetworkInfo != null && activeNetworkInfo.isConnected();
            }
            

            webView.loadUrl("http://www.google.com");

            最后别忘了在你的AndroidManifest.xml中添加以下三个权限:

            <uses-permission android:name="android.permission.INTERNET"/>
            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-14
              • 1970-01-01
              • 2012-04-13
              • 2019-03-27
              • 1970-01-01
              • 2020-10-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多