android webview拦截替换本地资源,提升加载性能,节省流量

本文介绍如何在Android WebView中通过拦截和替换本地资源,以提升网页加载性能并节省流量。常见于游戏应用,产品经理通常会提出这种需求,以提升用户体验。虽然文中未详细展开,但提及可以进一步利用WebView的缓存机制来优化。

android webview拦截替换本地资源,提升加载性能,节省流量

现在许多游戏都是直接提供一个访问地址,然后由webview去访问加载,加载速度的快慢取决于网速,当然也耗流量,这个时候,为了提高产品竞争力,产品经理就会提出需求了,web前端的同学也就会把资源给到Android前端,接下来就是要做的处理了,代码不多,用作记录:
package com.dxgame.demo;

import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.io.InputStream;
import java.util.HashMap;

public class CheckLocal extends AppCompatActivity {

    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.check_local);
        webView.setWebViewClient(webViewClient);
    }


    //WebViewClient主要帮助WebView处理各种通知、请求事件
    private WebViewClient webViewClient = new WebViewClient() {

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            Uri uri = request.getUrl();
            WebResourceResponse response = checkLocalWebResourceResponse(uri);
            if (response != null) {
                return response;
            }
            return super.shouldInterceptRequest(view, request);
        }

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            Uri uri = Uri.parse(url);
            WebResourceResponse response = checkLocalWebResourceResponse(uri);
            if (response != null) {
                return response;
            }
            return super.shouldInterceptRequest(view, url);
        }
    };

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private WebResourceResponse checkLocalWebResourceResponse(Uri uri) {
        WebResourceResponse resourceResponse = null;
        String urlStr = uri.toString();
        Log.i("checkUrl", urlStr);
        String path = uri.getPath();
        if (!TextUtils.isEmpty(path)) {
            path = path.substring(1);
        }
        try {
            InputStream input = getAssets().open(path);
            if (input != null) {
                Log.i("assetsPath", path);
                String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(path.substring(path.lastIndexOf(".") + 1));
                HashMap<String, String> header = new HashMap<>();
                header.put("Access-Control-Allow-Origin", "*");
                header.put("Access-Control-Allow-Headers", "Content-Type");
                resourceResponse = new WebResourceResponse(mimeType, "", 200, "ok", header, input);
            }
        } catch (Exception e) {
           e.printStackTrace();
        }
    }
  	  return resourceResponse;
}

还可以进一步优化,利用webview的缓存机制,将数据缓存到本地,方法就不列出来了,网上有很多,自行百度

可能有不足,如有问题,欢迎指出…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值