Android性能优化(1)---webview优化篇

简介: 写这篇文章的主要是因为在实际应用的时候遇到了很多棘手的问题(文章最后部分,交流一下遇到的问题),在这里分享出来让人少走一些弯路,如果有不对的地方直接留言即可相信一般做Android开发的同学都会或多或少的使用webview,(由于不太了解js,js交...

写这篇文章的主要是因为在实际应用的时候遇到了很多棘手的问题(文章最后部分,交流一下遇到的问题),在这里分享出来让人少走一些弯路,如果有不对的地方直接留言即可

相信一般做Android开发的同学都会或多或少的使用webview,(由于不太了解js,js交互的部分暂时没有)相信有不少人的使用过程是这样的

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </WebView>
</LinearLayout>

使用

    //设置webview
    WebSettings websettings = webView.getSettings();
    websettings.setJavaScriptEnabled(true);
    websettings.setDomStorageEnabled(true);
    websettings.setJavaScriptCanOpenWindowsAutomatically(true);
    websettings.setBuiltInZoomControls(false);// 
    webView.loadUrl(url);

上边这样使用,在使用量少的情况下可能没有问题,但是也给程序留下了不少隐患--内存泄漏,由于webview并没有完全清除掉,一直持有对应的上下文,导致内存无法被回收

说道这里就有了第一种的优化

优化一

既然说没有主动回收,那我们就手动回收在,activity的onDestroy方法中清除webview

public void onDestroy() {
    super.onDestroy();
    webView.clearHistory();
    webView.clearView();
    webView.removeAllViews();
    webView.destroy();
}

当你做完这些操作后,退出当前的activity,发现内存好像并没有减少(或者浮动不大)原因请参考
http://blog.csdn.net/u013085697/article/details/53259116

优化二

在需要用到webview的地方直接new一个出来,而不是在.xml文件中定义webview

布局

在布局需要使用webview的地方使用一个FrameLayout代替(其他的容器也可以)

使用
/**
*创建webview并添加到布局容器中
*/
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   WebView webView = WebviewUtil.createNewWebView(context);
   FrameLayout frameLayout  = findViewById(R.id.xxx);
   frameLayout.addView(mWebView);
}
...
/**
*创建webview公共方法
*/
public static android.webkit.WebView createNewWebView(Context context){
    android.webkit.WebView webView = new android.webkit.WebView(context.getApplicationContext());
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, new Paint());
    webView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    return webView;
}

/**
*清除webview
*/
public void onDestroy() {
 if (null != webView) {
        try {
            webView.removeJavascriptInterface("xx");
            webView.getSettings().setJavaScriptEnabled(false);
            webView.loadUrl("about:blank");
            webView.loadDataWithBaseURL(null, "", "text/html", "uft-8", null);
            ViewParent parent = webView.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(webView);
            }
            webView.clearHistory();
            webView.clearView();
            webView.removeAllViews();
            webView.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    super.onDestroy();
   
}

但是通过以上操作,查看内存并没有被回收.........

优化三 -- 开进程

当你的webview需要的内存很大,但是主进程申请不到更多的内存的情况下可以使用。

此方法各大主流APP基本都是这样操作的,在打开webview页面后,查看此应用的进程是否多开了一个。

开进程的方法也很简单只需要在你需要的activity在AndroidManifest中注册的时候添加“process”属性即可,但是注意进程间的通信;当关闭此activity时杀掉此进程不然内存不能被回收,下次进入时内存累加,最终会导致溢出

    <activity
        android:name=".Activity"
        android:process=":remoteView"
       />

如果打开进程的速度慢可以先进行进程的预加载,先启动一个和上边activity同一个进程的service,然后再打开activity

优化四--使用第三方

腾讯的x5内核,具体的优势可以参考腾讯官方文档

最后,再来说说我遇到的问题吧,首先需求是这样的一个页面需要多个统计图(百度的echarts,为了保持两端一致性和多样化的图表需求)每一个图表都需要一个对应的webview

没办法,产品提出来了

1开始使用第一种,崩溃,卡顿问题不断

2使用方法二,解决了大部分的机型,只有蓝绿大厂不行(吐槽中OPPO、vivo)
会出现无故的崩溃,查看logo日志(包括sdk底层logo日志)都只能找到一个内存地址的错误,比如:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x9ffffffff in tid 30218 (Thread-708)

没有其他任何提示,腾讯的bugly,友盟也没有抓取到相关的信息,崩溃中
后来查到两点问题

1、echarts的问题,其中有一个svg渲染(官方是beta版),是为了给低性能设备使用,看情况使用,有些图表会出现点击蓝屏闪烁(只是在webview范围之内),不过亲测内存降低了太多,没有使用前一个带滑块的图表达到了快200M,改为svg之后一直维持在30+M,提升明显,如果使用请自行测试多种机型

2、还是echarts 的问题,数据返回后多次向webview传入了数据导致崩溃,改为一次后暂未发现

以上两个问题目前只在OPPO和vivo手机发现,希望有此需求的小伙伴注意此问题

相关文章
|
12月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1141 4
|
24天前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
158 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
193 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
6月前
|
缓存 JavaScript 前端开发
Android WebView常见问题
本文主要介绍了在Android开发中WebView的使用方法,包括加载网址、设置相关属性(如JavaScript支持、缓存模式、屏幕适配等)、监听网页加载过程以及返回上一页面的功能实现。同时针对Android P版本限制明文流量的问题(ERR_CLEARTEXT_NOT_PERMITTED),提供了在`AndroidManifest.xml`中添加`android:usesCleartextTraffic=&quot;true&quot;`的解决办法。文章还附有完整代码示例,帮助开发者快速上手并解决常见问题。希望对您的开发工作有所帮助!
342 1
|
8月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1841 77
|
6月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
243 1
|
8月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
245 15
|
11月前
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
315 21
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
191 5

热门文章

最新文章