【问题标题】:webview Implement Load Cache When Offlinewebview离线时实现加载缓存
【发布时间】:2015-12-15 03:49:03
【问题描述】:

提前感谢我正在尝试将 webview 缓存机制实现到我已经完成的 webview apk,但我无法完成这项工作。 我很不专业。

好的,我做了一些更改,现在我没有错误,但应用程序仍然无法离线运行..

这是我的全部代码:

AndroidManifiest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="uy.celular.service.HR" >

    <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"/>
    <activity android:name="A" >
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="activity_a" />
        </intent-filter>
    </activity>
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17"/>
    <application

        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

          </application>

</manifest>

MainActivity.java

package uy.celular.service.HR;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;


public class MainActivity extends Activity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(uy.celular.service.HR.R.layout.activity_main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        webView = (WebView) findViewById(R.id.activity_main_webview);
        webView.setInitialScale(110);

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webView.setWebViewClient(new MyAppWebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                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);
                }
                view.loadUrl(url);
                return false;
            }
        });

        webView.loadUrl("http://www.celularservice.uy/p/mobile.html?m=1#trab");
        webView.setWebViewClient(new MyAppWebViewClient(){


            @Override
            public void onPageFinished(WebView view, String url) {
            //hide loading image
            findViewById(R.id.imageLoading1).setVisibility(View.GONE);
            //show webview
            findViewById(R.id.activity_main_webview).setVisibility(View.VISIBLE);

        }});
    }

    @Override
    public void onBackPressed() {
        if(webView.canGoBack()) {
            webView.goBack();
        } else {
            super.onBackPressed();
        }
    }


}

MyAppWebViewClient.java

package uy.celular.service.HR;

import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.content.Context;

public class MyAppWebViewClient extends WebViewClient {

    public Context context;
    public boolean isNetworkAvailable() {

        ConnectivityManager cm = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
    @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url != null && url.startsWith("http://www.celularservice.uy/p/wp.html?m=1")) {
                view.getContext().startActivity(
                        new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                return true;
            }
        if (url != null && url.startsWith("https://")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        }
        if( url.startsWith("http:") || url.startsWith("https:") ) {
            return false;
        }

        else if (url.startsWith("tel:")) {
            Intent tel = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
            view.getContext().startActivity(tel);
            return true;
        }
        else if (url.startsWith("sms:")) {
            Intent sms = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
            view.getContext().startActivity(sms);
            return true;
        }

        else if (url.startsWith("mailto:")) {
            Intent mail = new Intent(Intent.ACTION_SEND);
            mail.setType("application/octet-stream");
            mail.putExtra(Intent.EXTRA_EMAIL, new String[]{"celularservice.uy@gmail.com"});
            view.getContext().startActivity(mail);
            return true;
        }
        return true;

    }



}

记住我是新手,请详细回答

【问题讨论】:

    标签: android caching webview local offline


    【解决方案1】:

    替换这些:

    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 
    if (!isNetworkAvailable()) { // loading offline
    webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    }
    

    webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    

    你可以走了。我建议不要将 webView 用作 WebView 变量。此外,setAppCacheMaxSize 已被弃用。

    【讨论】:

      【解决方案2】:

      getSystemService(Context.CONNECTIVITY_SERVICE) 需要上下文。您要么需要将上下文传递给WebViewClient,要么将WebViewClient 设为活动的内部类

      【讨论】:

      • 嗨,感谢您的回答,现在应用程序运行但 srill 无法离线工作,我更新了问题。请具体说明我很新
      • 你试过LOAD_CACHE_ONLY没有网络可用吗?您还知道服务器是否对内容设置了一些过期时间吗?如果是这种情况,那么您可能还必须更改服务器实现
      • 你能告诉我有什么需要改变的吗?因为我是全新的.. 我们可以强制将页面保存到 sdcard 并从那里离线加载吗?谢谢
      • 看看这个。它解释了您可以在服务器端设置哪些标头以在 web 视图中启用缓存。 devcenter.heroku.com/articles/…
      • 我把 放在了头部,但没有任何改变。我认为问题出在代码中
      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多