Skip to content

Commit

Permalink
1.3.0 分支重构代码
Browse files Browse the repository at this point in the history
  • Loading branch information
杨充 committed Jun 8, 2020
1 parent f3677bc commit f325305
Show file tree
Hide file tree
Showing 30 changed files with 1,308 additions and 69 deletions.
Binary file modified .idea/caches/build_file_checksums.ser
Binary file not shown.
19 changes: 16 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
- 02.该库如何使用
- 03.js调用原理
- 04.问题反馈总结
- 05.webView优化
- 05.WebView优化
- 06.WebView知识点
- 07.其他说明介绍
- 07.WebView缓存
- 08.其他说明介绍




### 01.前沿说明
Expand Down Expand Up @@ -179,9 +182,19 @@



### 07.WebView缓存
- 01.WebView为何加载慢
- 02.解决WebView加载慢
- 03.浏览器缓存机制
- 04.WebView设置缓存
- 05.具体缓存那些内容
- 06.本地资源替换操作
- 07.如何处理预加载数据
- [更多内容查看wiki](https://github.com/yangchong211/YCWebView/wiki/7.1-%E7%BC%93%E5%AD%98%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86)



### 07.其他说明介绍
### 08.其他说明介绍
#### 关于其他内容介绍
![image](https://upload-images.jianshu.io/upload_images/4432347-7100c8e5a455c3ee.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.tencent.smtt.export.external.interfaces.WebResourceResponse;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import com.ycbjie.webviewlib.utils.EncodeUtils;
import com.ycbjie.webviewlib.utils.X5LogUtils;
import com.ycbjie.webviewlib.utils.X5WebUtils;
import com.ycbjie.webviewlib.helper.WebSchemeIntent;
Expand Down Expand Up @@ -80,7 +81,8 @@ public class X5WebViewClient extends WebViewClient {
*/
private final Stack<String> mUrlStack = new Stack<>();
/**
* 判断页面是否加载完成
* 判断页面是否正在加载
* 在onPageStarted中为true,在onPageFinished中为false
*/
private boolean mIsLoading = false;
/**
Expand Down Expand Up @@ -125,6 +127,7 @@ public X5WebViewClient(WebView webView ,Context context) {
private void recordUrl(String url) {
//判断当前url,是否和栈中栈顶部的url是否相同。如果不相同,则入栈操作
if (!TextUtils.isEmpty(url) && !url.equals(getUrl())) {
//如果重定向之前的链接不为空
if (!TextUtils.isEmpty(mUrlBeforeRedirect)) {
mUrlStack.push(mUrlBeforeRedirect);
mUrlBeforeRedirect = null;
Expand Down Expand Up @@ -210,7 +213,16 @@ private void resolveRedirect(WebView view) {
/**
* 这个方法中可以做拦截
* 主要的作用是处理各种通知和请求事件
* 返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
*
* 不准确的说法如下:
* 1.返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
* 2.返回: return true; 表示webView处理url是根据程序来执行的。 返回: return false; 表示webView处理url是在webView内部执行。
* 3.还有一种错误说法:WebView上的所有加载都经过这个方法。
*
* 准确说法,该方法说明如下所示:
* 若没有设置 WebViewClient 则由系统(Activity Manager)处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
* 若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理,也就是程序员自己做处理。
* 若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。
* @param view view
* @param url 链接
* @return 是否自己处理,true表示自己处理
Expand All @@ -225,11 +237,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (TextUtils.isEmpty(url)) {
return false;
}
try {
url = URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url = EncodeUtils.urlDecode(url);
/*WebView.HitTestResult hitTestResult = null;
if (url.startsWith("http:") || url.startsWith("https:")){
hitTestResult = view.getHitTestResult();
Expand Down Expand Up @@ -281,11 +289,7 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request
if (TextUtils.isEmpty(url)) {
return false;
}
try {
url = URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
url = EncodeUtils.urlDecode(url);
final Uri uri = Uri.parse(url);
//scheme跳转支持
if (uri!=null && uri.getScheme()!=null && WebSchemeIntent.isSilentType(uri.getScheme())) {
Expand Down Expand Up @@ -335,6 +339,7 @@ public void onPageStarted(WebView webView, String url, Bitmap bitmap) {
}
isLoadFinish = false;
if (mIsLoading && mUrlStack.size() > 0) {
//从url栈中取出栈顶的链接
mUrlBeforeRedirect = mUrlStack.pop();
}
recordUrl(url);
Expand Down Expand Up @@ -371,6 +376,24 @@ public void onPageFinished(WebView view, String url) {
isLoadFinish = true;
}


/**
* 当缩放改变的时候会调用该方法
* @param view view
* @param oldScale 之前的缩放比例
* @param newScale 现在缩放比例
*/
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
X5LogUtils.i("-------onScaleChanged-------"+newScale);
//视频全屏播放按返回页面被放大的问题
if (newScale - oldScale > 7) {
//异常放大,缩回去。
view.setInitialScale((int) (oldScale / newScale * 100));
}
}

/**
* 请求网络出现error
* 作用:加载页面的服务器出现错误时(如404)调用。
Expand Down Expand Up @@ -413,23 +436,6 @@ public void onReceivedError(WebView view, int errorCode, String description, Str
}
}

/**
* 当缩放改变的时候会调用该方法
* @param view view
* @param oldScale 之前的缩放比例
* @param newScale 现在缩放比例
*/
@Override
public void onScaleChanged(WebView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
X5LogUtils.i("-------onScaleChanged-------"+newScale);
//视频全屏播放按返回页面被放大的问题
if (newScale - oldScale > 7) {
//异常放大,缩回去。
view.setInitialScale((int) (oldScale / newScale * 100));
}
}

/**
* 6.0 之后
* 向主机应用程序报告Web资源加载错误。这些错误通常表明无法连接到服务器。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,9 @@ public static void webViewLoadLocalJs(WebView view, String path){

/**
* 解析assets文件夹里面的代码,去除注释,取可执行的代码
* @param c context
* @param urlStr 路径
* @return 可执行代码
* @param c context
* @param urlStr 路径
* @return 可执行代码
*/
public static String assetFile2Str(Context c, String urlStr){
InputStream in = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ public final class CacheExtensionConfig {
private HashSet<String> statics = new HashSet(STATIC);
private HashSet<String> no_cache = new HashSet(NO_CACH);

//全局默认的
/**
* 全局默认的
*/
private static HashSet STATIC = new HashSet() {
{
add("html");
Expand All @@ -46,6 +48,10 @@ public final class CacheExtensionConfig {
add("webp");
}
};

/**
* 下面这些是不用进行缓存的
*/
private static HashSet NO_CACH = new HashSet() {
{
add("mp4");
Expand Down Expand Up @@ -137,6 +143,7 @@ public boolean isHtml(String extension) {
}
return false;
}

public void clearAll() {
clearDiskExtension();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.cache.CacheInterceptor;


/**
Expand All @@ -28,6 +29,10 @@ public Response intercept(Chain chain) throws IOException {
if (!TextUtils.isEmpty(cache)&&cache.equals(WebCacheType.NORMAL.ordinal()+"")){
return originResponse;
}
//Cache-Control 是最重要的规则。常见的取值有private、public、no-cache、max-age、no-store、默认是private
//Cache-Control仅指定了max-age所以默认是private。
//缓存时间是31536000,也就是说这个时间段的再次请求这条数据,都会直接获取缓存数据库中的数据,直接使用。
//关于缓存原理,可以重点看一下这个类的源码:CacheInterceptor
return originResponse.newBuilder()
.removeHeader("pragma")
.removeHeader("Cache-Control")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,14 @@ public class WebAssetsLoader {
private Context mContext;
/**
* 资源内存缓存集合
* 多线程条件是数据安全的,没有用到锁,但是用到读写分离。【底层双数组实现,但有一点不具有时效性】
* CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
*/
private CopyOnWriteArraySet<String> mAssetResSet;
private String mDir="";
/**
* 文件名称
*/
private String mDir = "";
/**
* 是否清理
*/
Expand Down Expand Up @@ -83,6 +88,11 @@ private String getUrlPath(String url){
return uPath;
}

/**
* 通过路径找到对应的资源,然后将file文件转化成数据流InputStream, 并且返回回来
* @param url url地址
* @return
*/
public InputStream getResByUrl(String url){
String uPath = getUrlPath(url);
if (TextUtils.isEmpty(uPath)){
Expand Down Expand Up @@ -114,6 +124,10 @@ public WebAssetsLoader setDir(final String dir){
return this;
}

/**
* 初始化数据
* @return
*/
public WebAssetsLoader initData(){
if (!mIsSuffixMod){
return this;
Expand All @@ -136,6 +150,10 @@ public void clear(){
}
}

/**
* 将asset的file添加到集合中
* @param file
*/
private void addAssetsFile(String file){
String flag = mDir + File.separator;
if (!TextUtils.isEmpty(mDir)){
Expand All @@ -147,6 +165,11 @@ private void addAssetsFile(String file){
mAssetResSet.add(file);
}

/**
* 初始化资源,拿到缓存路径,然后遍历中的所有文件。将文件的路径保存到集合中
* @param dir
* @return
*/
private WebAssetsLoader initResourceNoneRecursion(String dir){
try {
LinkedList<String> list = new LinkedList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ public void init(WebViewCacheWrapper.Builder builder){
}
}

/**
* 单利获取对象
* @return 对象
*/
public static WebViewCacheDelegate getInstance(){
if (webViewCacheInterceptorInst==null){
synchronized (WebViewCacheDelegate.class){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,17 @@ public boolean verify(String hostname, SSLSession session) {
mHttpClient = builder.build();
}


/**
* 拦截处理的入口
* @param request request请求
* @return
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse interceptRequest(WebResourceRequest request) {
return interceptRequest(request.getUrl().toString(), request.getRequestHeaders());
String url = request.getUrl().toString();
Map<String, String> requestHeaders = request.getRequestHeaders();
return interceptRequest(url, requestHeaders);
}

private Map<String, String> buildHeaders() {
Expand All @@ -155,9 +161,15 @@ private Map<String, String> buildHeaders() {
return headers;
}

/**
* 拦截处理的入口
* @param url url链接
* @return
*/
@Override
public WebResourceResponse interceptRequest(String url) {
return interceptRequest(url, buildHeaders());
Map<String, String> requestHeaders = buildHeaders();
return interceptRequest(url, requestHeaders);
}

/**
Expand Down Expand Up @@ -294,10 +306,13 @@ private WebResourceResponse interceptRequest(String url, Map<String, String> hea
if (mCacheType == WebCacheType.NORMAL) {
return null;
}
//第一步:判断拦截资源的条件。比如那些需要拦截,那些不需要拦截
//第一步:判断拦截资源的条件。比如那些需要拦截,那些不需要拦截
if (!checkUrl(url)) {
return null;
}

//先从缓存中获取数据,也就是本地缓存文件中获取数据
if (isEnableAssets()) {
InputStream inputStream = WebAssetsLoader.getInstance().getResByUrl(url);
if (inputStream != null) {
Expand All @@ -307,6 +322,8 @@ private WebResourceResponse interceptRequest(String url, Map<String, String> hea
return webResourceResponse;
}
}

//如果本地缓存没有,则创建OkHttp的Request请求,将资源网络请求交给okHttp来处理,并且用它自带的缓存功能
try {
Request.Builder reqBuilder = new Request.Builder().url(url);
String extension = MimeTypeMapUtils.getFileExtensionFromUrl(url);
Expand Down
Loading

0 comments on commit f325305

Please sign in to comment.