使用android TV的webview加载本地网页时,网页中存在随网页持续运行的css动画(文字滚动;图片旋转、平移),但是程序内存Native层与Graphics层内存一直增加;
目前就是在电视盒子与原生android电视出现这种现象,但是在其他的普通android屏中运行正常;
是webview缺失什么设置吗?还是css的代码有问题?
运行没多久就这样了,内存一直增加,时间长就自己卡死崩掉了;
求解!真的困扰好久了。
webview设置:
可能有几个原因导致这种现象:
WebView的缓存问题。如果你已经访问过同一页面并且存在于Webview缓存中,则动画会继续运行并且不断重绘。你可以尝试清除WebView缓存并重新加载页面来解决这个问题。
Android TV硬件限制。 Android TV硬件可能无法处理大量图形操作,特别是动画效果,如果您的页面中存在大量动画效果,则Android TV可能会出现内存问题。
CSS代码的问题。在某些情况下,不正确的CSS代码可能会导致重绘和内存问题。 您可以尝试调整我们的CSS代码,看看是否有任何改进。 特别是,您可能需要调整动画时间间隔,以减少动画在每秒钟内的重绘量。
内存溢出一般就是使用的资源,尤其是图片等占用内存过大导致的。可以先检查下与动画相关的css代码是否存在问题,比如绘制的图片过大,绘制频率过快等。其次检查下webview缓存是否启用,它可能会导致内存使用量过高,因为缓存的页面和资源会占用内存。可以禁用Webview缓存看看。
可能是由于Android TV的硬件限制导致的。在Android TV上,硬件加速可能受到限制,导致内存使用量增加。
如果你的应用使用的是系统默认的 WebView 实现,尝试更新 WebView 版本到最新版本,以获取性能改进和 bug 修复。
试试禁用硬件加速或调整WebView的缓存策略
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的缓存机制,将数据缓存到本地,方法就不列出来了,网上有很多,自行百度
可能有不足,如有问题,欢迎指出…