有偿!android TV通过webview加载本地网页的css动画导致内存溢出?

使用android TV的webview加载本地网页时,网页中存在随网页持续运行的css动画(文字滚动;图片旋转、平移),但是程序内存Native层与Graphics层内存一直增加;

目前就是在电视盒子与原生android电视出现这种现象,但是在其他的普通android屏中运行正常;

是webview缺失什么设置吗?还是css的代码有问题?

img

运行没多久就这样了,内存一直增加,时间长就自己卡死崩掉了;

求解!真的困扰好久了。

webview设置:

img

可能有几个原因导致这种现象:

WebView的缓存问题。如果你已经访问过同一页面并且存在于Webview缓存中,则动画会继续运行并且不断重绘。你可以尝试清除WebView缓存并重新加载页面来解决这个问题。

Android TV硬件限制。 Android TV硬件可能无法处理大量图形操作,特别是动画效果,如果您的页面中存在大量动画效果,则Android TV可能会出现内存问题。

CSS代码的问题。在某些情况下,不正确的CSS代码可能会导致重绘和内存问题。 您可以尝试调整我们的CSS代码,看看是否有任何改进。 特别是,您可能需要调整动画时间间隔,以减少动画在每秒钟内的重绘量。

内存溢出一般就是使用的资源,尤其是图片等占用内存过大导致的。可以先检查下与动画相关的css代码是否存在问题,比如绘制的图片过大,绘制频率过快等。其次检查下webview缓存是否启用,它可能会导致内存使用量过高,因为缓存的页面和资源会占用内存。可以禁用Webview缓存看看。

可能是由于Android TV的硬件限制导致的。在Android TV上,硬件加速可能受到限制,导致内存使用量增加。

  1. 优化CSS代码:检查网页中的CSS动画是否过于复杂或耗费资源。尝试简化或优化这些动画,以减少内存使用。
  2. 使用Webview的缓存机制:启用WebView的缓存功能,将已经加载过的页面缓存到本地,当再次访问相同的页面时,可以直接从缓存中读取,而不是重新加载整个页面。这可以减少内存使用和加载时间。

如果你的应用使用的是系统默认的 WebView 实现,尝试更新 WebView 版本到最新版本,以获取性能改进和 bug 修复。

试试禁用硬件加速或调整WebView的缓存策略

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/269866
  • 这篇博客也不错, 你可以看下一款Android 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的缓存机制,将数据缓存到本地,方法就不列出来了,网上有很多,自行百度

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