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

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

前言

本文接上文  编写极简抖音的难点|青训营笔记 - 掘金 (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 中对各种类型资源的加载,对相关的进程只做必要额加载
  • 多进程的开启不放到需要跳转时候才开启,对进程进行一个预加载



相关文章
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
1446 5
|
负载均衡 安全 Java
深入了解Spring Cloud Gateway:构建高效微服务网关
Spring Cloud Gateway是一个强大的微服务网关,它在现代分布式架构中扮演着至关重要的角色。本文将深入介绍Spring Cloud Gateway的核心概念、功能和用途,以帮助您更好地理解和利用这一工具来构建高效的微服务应用。
|
9月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
数据可视化 图形学 开发者
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(上)
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例
5148 61
|
消息中间件 Kafka RocketMQ
Kafka重平衡机制
当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配分区再进行消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。
2183 0
Kafka重平衡机制
|
Rust 开发工具 git
【一起学Rust】Rust包管理工具Cargo初步了解
【一起学Rust】Rust包管理工具Cargo初步了解
518 0
|
消息中间件 存储 Java
RabbitMQ——高级篇
RabbitMQ——高级篇
367 0
|
Linux KVM 虚拟化
系统虚拟化基本概念与发展历史和趋势展望
系统虚拟化基本概念与发展历史和趋势展望
1215 0
|
JavaScript 前端开发 Java
springboot+vue旧物置换网站(完整源码+文档)
本文介绍了一个基于SpringBoot的旧物置换网站项目,由Java开发,使用SSH和SSM框架,JDK1.8,MySQL5.7+数据库,前端技术包括Node.js和Vue。系统架构包括管理员、卖家和用户三个角色,分别有各自的后台管理功能,如用户管理、旧物信息管理、置换交易管理等。此外,文章还提到了可用的Java毕设项目资源。如需获取项目源码或了解更多详情,可联系作者。
|
Python
Flask读取本地资源供外部访问
Flask读取本地资源供外部访问
319 0