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

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

Application 优化

下面附上我的 Application 的代码

public class App extends Application {
    private static Context context;
    private static String sCurProcessName = null;
    private String processName;
    private String packageName;
    /**
     * Set the base context for this ContextWrapper.  All calls will then be
     * delegated to the base context.  Throws
     * IllegalStateException if a base context has already been set.
     *
     * @param base The new base context for this wrapper.
     */
    @Override protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        processName = getCurProcessName(base);
        packageName = getPackageName();
    }
    private boolean isMainProcess() {
        return !TextUtils.isEmpty(packageName) && TextUtils.equals(packageName, processName);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        if (isMainProcess()){
            MMKV.initialize(this);
            MMKV.mmkvWithID("MyID", MMKV.SINGLE_PROCESS_MODE, GlobalConstant.MMKV_KEY);
            //载入Dokit监测
            new DoKit.Builder(this)
                    .productId(context.getString(R.string.value_dokit_pid))
                    .build();
            //使用订阅索引,加快编译速度
            EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
            // 抖音授权
            String clientkey = context.getString(R.string.value_client_key);
            DouYinOpenApiFactory.init(new DouYinOpenConfig(clientkey));
            //初始化
            MyUtil.initialize(this);
            //设置UI工具
            RxTool.init(this);
            //网络缓存
            RetrofitCache.getInstance().init(this);
        }else {
            QbSdk.initX5Environment(getContext(), new QbSdk.PreInitCallback() {
                @Override
                public void onCoreInitFinished() {
                    // 内核初始化完成,可能为系统内核,也可能为系统内核
                }
                /**
                 * 预初始化结束
                 * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
                 * @param isX5 是否使用X5内核
                 */
                @Override
                public void onViewInitFinished(boolean isX5) {
                    LogUtil.i("是否使用腾讯内核:" + isX5);
                }
            });
        }
        //设置打印开关
        LogUtil.setIsLog(true);
        //注册Activity生命周期
        registerActivityLifecycleCallbacks(ActivityUtil.getActivityLifecycleCallbacks());
    }
    public static Context getContext() {
        return context;
    }
    private static String getCurProcessName(Context context) {
        if (!TextUtils.isEmpty(sCurProcessName)) {
            return sCurProcessName;
        }
        sCurProcessName = getProcessName(android.os.Process.myPid());
        if (!TextUtils.isEmpty(sCurProcessName)) {
            return sCurProcessName;
        }
        try {
            int pid = android.os.Process.myPid();
            sCurProcessName = getProcessName(pid);
            if (!TextUtils.isEmpty(sCurProcessName)) {
                return sCurProcessName;
            }
            //获取系统的ActivityManager服务
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            if (am == null) {
                return sCurProcessName;
            }
            for (ActivityManager.RunningAppProcessInfo appProcess : am.getRunningAppProcesses()) {
                if (appProcess.pid == pid) {
                    sCurProcessName = appProcess.processName;
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sCurProcessName;
    }
    private static String getProcessName(int pid) {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
            String processName = reader.readLine();
            if (!TextUtils.isEmpty(processName)) {
                processName = processName.trim();
            }
            return processName;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
复制代码

在 Application 中,我对当前进程进行判断,在对应的进程中才加载对应的资源,避免资源的过度加载

进程的预加载

对应多进程中,我们进行一个预加载,可以让APP需要启用到这个进程的时候,检测到有对应的进程已经创建了,就不会再次重新启用这个进程了,这样子就和打开一个普通的 Activity 的界面速度是一样的了。

进程预加载,我们需要使用到不可的服务或者广播,只需要将其绑定在同一个进程中,且对应服务为空即可。

<!--AndroidManifest.xml-->
<activity
          android:name=".module.mine.activity.WebViewActivity"
          android:configChanges="orientation|screenSize|keyboardHidden"
          android:exported="false"
          android:process=":h5"
          android:screenOrientation="portrait"
          android:theme="@style/BlackTheme" />
<service
         android:name=".module.mine.service.PreLoadService"
         android:process=":h5"
         android:enabled="true"
         android:exported="false" >
</service>
复制代码
public class PreLoadService extends Service {
  public PreLoadService() {
  }
  @Override public IBinder onBind(Intent intent) {
    // TODO: Return the communication channel to the service.
    throw new UnsupportedOperationException("Not yet implemented");
  }
}
复制代码
//在对应的生命周期启用即可
private void startHideService(){
    Intent intent = new Intent(this, PreLoadService.class);
    this.startService(intent);
}
private void stopHideService(){
    Intent intent = new Intent(this, PreLoadService.class);
    this.stopService(intent);
}
复制代码

WebView启动白屏

关于启动页白屏问题,和 初次启动白屏 的解决方案一致,我们设置这个Activity的背景为黑色,与抖音页面的背景一个颜色即可。

同时,我们需要注意的是,WebView 的背景也请记得设置为黑色

相关文章
|
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
|
缓存 Android开发
极简抖音中的优化点|青训营笔记(一)
下面我将罗列出几项我在项目中发现的可优化点,以及其优化方案。
极简抖音中的优化点|青训营笔记(一)
|
移动开发 小程序 JavaScript
手撸一个在线学习在线教育小程序
最近有小伙伴找小孟开发了一个在线教育的小程序项目。
154 0
手撸一个在线学习在线教育小程序