极简抖音中的优化点|青训营笔记(一)

简介: 下面我将罗列出几项我在项目中发现的可优化点,以及其优化方案。

前言

本文接上文  编写极简抖音的难点|青训营笔记 - 掘金 (juejin.cn),继续阐述我们在编写极简抖音期间进行优化的点。

对一个项目进行优化的时候,首先我们需要去检测项目中有什么需要优化的点。这时我们便需要使用到性能分析工具来对APP的各项性能进行检测,在本文中使用到的性能分析工具是 Dokit 。

下面我将罗列出几项我在项目中发现的可优化点,以及其优化方案。

初次启动白屏

由于APP启动的时候需要先启动 Application 进行初始化,在这个期间,会带来一个短暂的白屏展示,而这个白屏会给用户带来一个卡顿的感觉。

我们需要把白屏变成图案,这样子用户启动的时候就不会是看到一片空白。我使用到的方案是新建一个 SplashActivity,让其来充当一个启动页。

我们要解决以下几点问题:

  1. 如何让未展示到 SplashActivity 的界面的时候,其背景就已经是我们需要设置的图案了
  2. SplashActivity 如何有效降低内存占用

首先,第一个问题,我们需要设置对应的主题,因为 Activity 在未加载绑定的布局资源的时候,会先加载主题文件,所以我们修改主题文件就可以把对应的白屏变为我们想要的启动页了

下面展示我的相关代码

<!--res/drawable/splash_bg.xml-->
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>
    <item
        android:gravity="center"
        android:drawable="@drawable/potato"
        />
</layer-list>
复制代码
<!--AndroidManifest.xml-->
<activity
    android:name=".module.mine.activity.SplashActivity"
    android:exported="true"
    android:theme="@style/SplashTheme" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
复制代码
//SplashActivity.java
public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        ActivityUtil.startActivity(HomeActivity.class, true);
    }
}
复制代码

像上方这样子设置后,我们在启动的时候,就可以直接看到我们的启动页了

1.webp.jpg

ViewPage2预加载带来的多次请求

当我们使用到 ViewPage2 去做一些 fragment 的加载的时候,我们有需求让滑动到对应的位置的时候才进行页面的加载,并且滑动回去的时候不再进行加载。

但是 ViewPage 本身就预设定了会进行预加载,我们无法对其预加载做一个禁止。所以要完成我们的业务,我们可以对 Fragment 做一个懒加载,就是在加载的时候,预先加载布局,但是不加载数据。

// 关闭预加载
getBinding().viewPager2.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);  // 可以不设置 因为默认是 -1 默认不进行预加载
// 这个必须设置 不然仍然会启用预加载
        ((RecyclerView)getBinding().viewPager2.getChildAt(0)).getLayoutManager().setItemPrefetchEnabled(false);
// 设置缓存数量,对应 RecyclerView 中的 mCachedViews,即屏幕外的视图数量,此处设置为2
((RecyclerView)getBinding().viewPager2.getChildAt(0)).setItemViewCacheSize(2);
复制代码

使用上述的代码,就可以让 ViewPage 页面进行懒加载,并且会对之前加载的页面进行一定数量的缓存

布局层过多,导致页面绘制压力大

1.webp.jpg

在此,我们容易看到,APP 的UI层级普遍过高,这是由于使用线性布局等,会带来层级过多的问题,这会导致App显示的时候需要渲染的次数也多,这也直接导致了 APP 的性能问题。譬如在启动一个 Activity ,或者页面有动画的时候,会看到帧率明显降低,并且会导致 APP 出现明显的卡顿。

我的解决方案是,选用约束布局,当我们的页面比较复杂的时候,选用约束布局会使得我们的布局层数可以明显的减低。关于约束布局的学习,我们可以查看这篇文章 最全面的ConstraintLayout教程 (qq.com)

WebView的启动耗时以及内存占用

当我们使用 WebView 的时候,我们一般会给其单开一个进程,这样子 WebView 也就不会影响到我们的主进程。由于 WebView 容易发生内存泄露,所以它会有相对大的崩溃可能性,所以我们为其单开一个进程,提高 App 可使用的内存并且不影响主进程的使用。

但是这也产生一个问题,那就是新开一个进程的时候,会去重新执行一次 Application ,会导致第一次开启新的进程时候会有较久的白屏

解决方案:

  • 优化 Applicaiton 中对各种类型资源的加载,对相关的进程只做必要额加载
  • 多进程的开启不放到需要跳转时候才开启,对进程进行一个预加载



相关文章
|
3月前
|
SQL 存储 关系型数据库
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
Mysql优化提高笔记整理,来自于一位鹅厂大佬的笔记,阿里P7亲自教你
|
1月前
|
Python
京东技术团队撰写的整整986页《漫画学Python》到底有什么魅力?
这是一本Python入门书。无论您是想学习编程的小学生,还是想参加计算机竞赛的中学生,抑或是计算机相关专业的大学生,甚至是正在从事软件开发的职场人,本书都适合您阅读和学习。但您若想更深入地学习Python并进行深层次应用,则需要选择其他相关图书。
|
1月前
|
Web App开发 机器人
小白一学就会的 小红书全自动写文发文机器人-抓取爆款笔记(一)
小白一学就会的 小红书全自动写文发文机器人-抓取爆款笔记(一)
41 4
|
2月前
|
存储 缓存 监控
2024春招小红书前端面试题分享
2024春招小红书前端面试题分享
91 3
|
3月前
|
开发框架 算法 Java
28天读完349页,这份阿里面试通关手册,助我闯进字节跳动
今年的面试比往年要难得多,各个互联网企业对于Java岗位的要求越来越多,也越来越高,主要是初级岗位已经趋近饱和,但高级岗位又相对来说缺乏,这类的人才偏少,因此作为Java开发人员,我们应该思考的是怎么去往高级人才发展,而不是转学其他语言,要懂得去成为金字塔顶端的人,而不是逃避一直做基层的人。
|
8月前
|
分布式计算 Java 大数据
震精,京东T8工程师每天熬夜到天明,竟只是为一套编程实战文档
大数据开发工程师系列共六本,包括Java面向对象编程、Java核心API编程、Java Web开发实战、MySQL数据库开发实战、SSM企业级框架实战、Hadoop & Spark大数据开发实战,一套比较全面的开发工程师书籍。
|
11月前
|
开发框架 Java Spring
高光时刻!美团推出Spring源码进阶宝典:脑图+视频+文档
Spring是一个开源框架,相信很多做Java开发的技术人员对Spring并不陌生,Spring是现在企业中经常会用到的,是为了解决企业应用程序开发复杂性而创建的。Spring主要的优势就是可以分层架构,可以为你提供选择使用哪一个组件,同时也会为J2EE应用程序开发体提供集成的框架!
60 0
[图文]微课设计零基础入门 | 5.微课知识点的选择
微课有一个好处就是:不受你现任科目的限制,你可以随意“跨学科、跨专业”,语文老师也可以制作数学微课,音乐老师也可以制作体育微课!不过,可千万别犯知识性错误哦~
84 0
|
移动开发 小程序 JavaScript
手撸一个在线学习在线教育小程序
最近有小伙伴找小孟开发了一个在线教育的小程序项目。
154 0
手撸一个在线学习在线教育小程序
|
消息中间件 缓存 程序员
卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书
在解答“为什么要学习高并发系统设计”之前,我想让你思考几个问题: 在微博中,明星动辄拥有几千万甚至上亿的粉丝,你要怎么保证明星发布的内容让粉丝实时地看到呢? 淘宝双十一,当你和上万人一起抢购一件性价比超高的衣服时,怎么保证衣服不会超卖? 春运时我们都会去 12306 订购火车票,以前在抢票时经常遇到页面打不开的情况,那么如果你来设计 12306 系统,要如何保证在千万人访问的同时也能支持正常抢票呢?
卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书