Kaynağa Gözat

使用CacheWebView来缓存webView静态资源

zengjiebin 7 yıl önce
ebeveyn
işleme
188013244e

+ 2 - 0
app/build.gradle

@@ -430,6 +430,8 @@ dependencies {
     implementation 'com.alibaba:fastjson:1.2.52'
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.34'
 //    implementation 'com.github.yangjie10930:EpMedia:v0.9.5'
+    //webView 缓存优化初始化 https://github.com/yale8848/CacheWebView
+    implementation 'ren.yale.android:cachewebviewlib:2.1.4'
 }
 
 static def releaseTime() {

+ 15 - 1
app/proguard-rules.pro

@@ -474,4 +474,18 @@
  #下面的库在host和media plugin中都有使用,混淆后在media中找不到类,暂时不混淆
 -keep class com.alibaba.fastjson.** { *; }
 -keep class com.chad.library.** { *; }
--keep class com.bumptech.glide.** { *; }
+-keep class com.bumptech.glide.** { *; }
+
+
+#==================webView 缓存优化初始化 https://github.com/yale8848/CacheWebView==========================
+#CacheWebview
+-dontwarn ren.yale.android.cachewebviewlib.**
+-keep class ren.yale.android.cachewebviewlib.**{*;}
+
+#okhttp
+-dontwarn okhttp3.**
+-keep class okhttp3.**{*;}
+
+#okio
+-dontwarn okio.**
+-keep class okio.**{*;}

+ 51 - 0
app/src/main/java/com/sheep/gamegroup/module/webview/util/WebResourceRequestAdapter.java

@@ -0,0 +1,51 @@
+package com.sheep.gamegroup.module.webview.util;
+
+import android.annotation.TargetApi;
+import android.net.Uri;
+import android.os.Build;
+
+import java.util.Map;
+
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class WebResourceRequestAdapter implements android.webkit.WebResourceRequest {
+
+    private com.tencent.smtt.export.external.interfaces.WebResourceRequest mWebResourceRequest;
+
+    private WebResourceRequestAdapter(com.tencent.smtt.export.external.interfaces.WebResourceRequest x5Request){
+        mWebResourceRequest = x5Request;
+    }
+
+    public static WebResourceRequestAdapter adapter(com.tencent.smtt.export.external.interfaces.WebResourceRequest x5Request){
+        return new WebResourceRequestAdapter(x5Request);
+    }
+
+    @Override
+    public Uri getUrl() {
+        return mWebResourceRequest.getUrl();
+    }
+
+    @Override
+    public boolean isForMainFrame() {
+        return mWebResourceRequest.isForMainFrame();
+    }
+
+    @Override
+    public boolean isRedirect() {
+        return mWebResourceRequest.isRedirect();
+    }
+
+    @Override
+    public boolean hasGesture() {
+        return mWebResourceRequest.hasGesture();
+    }
+
+    @Override
+    public String getMethod() {
+        return mWebResourceRequest.getMethod();
+    }
+
+    @Override
+    public Map<String, String> getRequestHeaders() {
+        return mWebResourceRequest.getRequestHeaders();
+    }
+}

+ 57 - 0
app/src/main/java/com/sheep/gamegroup/module/webview/util/WebResourceResponseAdapter.java

@@ -0,0 +1,57 @@
+package com.sheep.gamegroup.module.webview.util;
+
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import java.io.InputStream;
+import java.util.Map;
+
+public class WebResourceResponseAdapter extends com.tencent.smtt.export.external.interfaces.WebResourceResponse {
+
+    private android.webkit.WebResourceResponse mWebResourceResponse;
+
+    private WebResourceResponseAdapter(android.webkit.WebResourceResponse webResourceResponse){
+        mWebResourceResponse = webResourceResponse;
+    }
+
+    public static WebResourceResponseAdapter adapter(android.webkit.WebResourceResponse webResourceResponse){
+        if (webResourceResponse == null){
+            return null;
+        }
+        return new WebResourceResponseAdapter(webResourceResponse);
+
+    }
+
+    @Override
+    public String getMimeType() {
+        return mWebResourceResponse.getMimeType();
+    }
+
+    @Override
+    public InputStream getData() {
+        return mWebResourceResponse.getData();
+    }
+
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+    @Override
+    public int getStatusCode() {
+        return mWebResourceResponse.getStatusCode();
+    }
+
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+    @Override
+    public Map<String, String> getResponseHeaders() {
+        return mWebResourceResponse.getResponseHeaders();
+    }
+
+    @Override
+    public String getEncoding() {
+        return mWebResourceResponse.getEncoding();
+    }
+
+    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+    @Override
+    public String getReasonPhrase() {
+        return mWebResourceResponse.getReasonPhrase();
+    }
+}

+ 2 - 0
app/src/main/java/com/sheep/gamegroup/util/SysAppUtil.java

@@ -56,6 +56,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.functions.Function;
 import io.reactivex.schedulers.Schedulers;
 import okhttp3.Call;
+import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;
 import rx.functions.Action1;
 
 import static com.sheep.gamegroup.util.UMConfigUtils.Event.UPGRADE_DIALOG_BT;
@@ -123,6 +124,7 @@ public class SysAppUtil {
                         Glide.get(SheepApp.getInstance()).clearDiskCache();//清理图片
                         ClassFileHelper.getInstance().clearDir();//清理下载文件
                         DataUtil.getInstance().clearScreenShots();//清除所有截图
+                        WebViewCacheInterceptorInst.getInstance().clearCache();//清除webView缓存
                         return integer;
                     }
                 })

+ 15 - 0
app/src/main/java/com/sheep/gamegroup/util/js/BaseActWeb.java

@@ -1,6 +1,7 @@
 package com.sheep.gamegroup.util.js;
 
 import android.view.View;
+import android.webkit.WebView;
 
 import com.sheep.gamegroup.absBase.BaseActivity;
 import com.sheep.gamegroup.absBase.BaseUMActivity;
@@ -15,7 +16,9 @@ import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
 import com.umeng.socialize.bean.SHARE_MEDIA;
 
 import java.util.Locale;
+import java.util.Map;
 
+import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;
 import rx.functions.Action1;
 
 /**
@@ -96,4 +99,16 @@ public abstract class BaseActWeb extends BaseUMActivity {
         //取消分享 微信分享时,没有取消
         loadJs(String.format(Locale.CHINA, "callback(\"onCancel\", %s)", share_media.getName()));
     }
+
+    protected void webViewLoadUrl(com.tencent.smtt.sdk.WebView webView, String url){
+        webView.loadUrl(url);
+        WebViewCacheInterceptorInst.getInstance().loadUrl(url, webView.getSettings().getUserAgentString());
+    }
+    protected void webViewLoadUrl(com.tencent.smtt.sdk.WebView webView, Map<String, String> map, String url){
+        webView.loadUrl(url);
+        WebViewCacheInterceptorInst.getInstance().loadUrl(url, map, webView.getSettings().getUserAgentString());
+    }
+    protected void webViewLoadUrl(WebView webView, String url){
+        WebViewCacheInterceptorInst.getInstance().loadUrl(webView,url);
+    }
 }

+ 20 - 5
app/src/main/java/com/sheep/gamegroup/view/activity/ActWebX5.java

@@ -17,6 +17,8 @@ import android.view.View;
 
 import com.sheep.gamegroup.absBase.IJumpWeb;
 import com.sheep.gamegroup.model.entity.WebParams;
+import com.sheep.gamegroup.module.webview.util.WebResourceRequestAdapter;
+import com.sheep.gamegroup.module.webview.util.WebResourceResponseAdapter;
 import com.sheep.gamegroup.util.CommonUtil;
 import com.sheep.gamegroup.util.Jump2View;
 import com.sheep.gamegroup.util.LogUtil;
@@ -33,6 +35,8 @@ import com.sheep.jiuyan.samllsheep.SheepApp;
 import com.sheep.jiuyan.samllsheep.utils.G;
 import com.sheep.jiuyan.samllsheep.utils.SpUtils;
 import com.sheep.jiuyan.samllsheep.utils.TitleBarUtils;
+import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
+import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
 import com.tencent.smtt.sdk.ValueCallback;
 import com.tencent.smtt.sdk.WebChromeClient;
 import com.tencent.smtt.sdk.WebSettings;
@@ -49,6 +53,7 @@ import java.util.Map;
 
 import butterknife.BindView;
 import okhttp3.Call;
+import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;
 
 
 /**
@@ -257,6 +262,16 @@ public class ActWebX5 extends BaseActWeb {
         });
         mWebView.setWebViewClient(new WebViewClient() {
             @Override
+            public WebResourceResponse shouldInterceptRequest(WebView webView, String s) {
+                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().interceptRequest(s));
+            }
+
+            @Override
+            public WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest) {
+
+                return WebResourceResponseAdapter.adapter(WebViewCacheInterceptorInst.getInstance().interceptRequest(WebResourceRequestAdapter.adapter(webResourceRequest)));
+            }
+            @Override
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 LogUtil.println("ActWeb", "shouldOverrideUrlLoading", url);
                 //微信H5支付核心代码
@@ -293,12 +308,12 @@ public class ActWebX5 extends BaseActWeb {
                 } else if (url.contains("17xmy.com")) {
                     Map<String, String> extraHeaders = new HashMap<>();
                     extraHeaders.put("Referer", "http://17xmy.com");
-                    view.loadUrl(url, extraHeaders);
+                    webViewLoadUrl(view, extraHeaders, url);
                     return true;
                 } else if (url.contains("kfzs.com") || (url.startsWith("http://10.8.") && TestUtil.isDev())) {
                     Map<String, String> extraHeaders = new HashMap<>();
                     extraHeaders.put("Referer", "http://kfzs.com");
-                    view.loadUrl(url, extraHeaders);
+                    webViewLoadUrl(view, extraHeaders, url);
                     return true;
                 } else {
                     return false;
@@ -327,13 +342,13 @@ public class ActWebX5 extends BaseActWeb {
             if (CommonUtil.getInstance().judgeUrlPicture(url)) {
                 runWebviewUrl("file:///android_asset/loadImg.html");
             } else {
-                mWebView.loadUrl(loadUrl);
+                webViewLoadUrl(mWebView, loadUrl);
             }
         } else {
             if (CommonUtil.getInstance().judgeUrlPicture(url)) {
                 runWebviewUrl("file:///android_asset/loadImg.html");
             } else {
-                mWebView.loadUrl(url);
+                webViewLoadUrl(mWebView, url);
             }
         }
     }
@@ -440,7 +455,7 @@ public class ActWebX5 extends BaseActWeb {
             @Override
             public void run() {
                 if (mWebView != null && !TextUtils.isEmpty(url)) {
-                    mWebView.loadUrl(url);
+                    webViewLoadUrl(mWebView, url);
                 }
             }
         });

+ 4 - 0
app/src/main/java/com/sheep/jiuyan/samllsheep/SheepApp.java

@@ -59,6 +59,8 @@ import org.xutils.x;
 import java.lang.ref.WeakReference;
 
 import cn.jpush.android.api.JPushInterface;
+import ren.yale.android.cachewebviewlib.WebViewCacheInterceptor;
+import ren.yale.android.cachewebviewlib.WebViewCacheInterceptorInst;
 
 /**
  * Created by kemllor on 2017/12/21.
@@ -262,6 +264,8 @@ public class SheepApp extends MultiDexApplication {
         DownloadDispatcher.setMaxParallelRunningCount(1000);//在这里,下载框架好像有个bug,如果设置为5,第一个下载会占4个,第二个下载就只有一个在下载,就会失败
 
 //        RemitStoreOnSQLite.setRemitToDBDelayMillis(3000);
+        //webView 缓存优化初始化 https://github.com/yale8848/CacheWebView
+        WebViewCacheInterceptorInst.getInstance().init(new WebViewCacheInterceptor.Builder(this).setDebug(BuildConfig.DEBUG).setCacheSize(Long.MAX_VALUE));
     }
 
     private void initBdLocationOption() {