博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android onWindowFocusChanged() 配合 WeakReference 弱引用解决页面间跳转不连贯问题
阅读量:6612 次
发布时间:2019-06-24

本文共 2658 字,大约阅读时间需要 8 分钟。

      小菜最近在处理适配方面的问题,今天发现在一些低版本且性能不佳的手机上,冷启动过程中,从 SplashActivity 到 MainActivity 过程中,主页面还没有加载完,启动页先销毁回到手机主页面,过1-2s才进入 MainActivity,中间的间隔时间比较长,用户体验较差。

      小菜调试了很久,通过【弱引用 + onWindowFocusChanged】的方式来解决目前的问题,也许不是最好的处理方式,但小菜觉得是相对简单的方式,因此记录一下。

问题原因

      小菜的 MainActivity 中需要处理很多业务逻辑以及配置项处理等,在 UI 页面展示前会相对较慢,因此导致前一个 SplashActivity 页面已经销毁但是后一个主 MainActivity 还没有加载出来,导致一个较长的时间间隔。

技术方向

WeakReference 弱引用

      弱引用,即在引用对象的同时仍然允许通过垃圾回收来回收该对象。Android 中常用来在非 UI 线程处理图片和 Handler 与 Activity 的交互等。

onWindowFocusChanged() 周期函数

      判断窗口变化,在当前 Activity 的窗口获取焦点或失去焦点时进行回调。

解决方式

  1. 在第一个页面中添加弱引用,并且在页面跳转过程中不直接 finish 掉本页面;
public class SplashActivity extends AppCompatActivity {    private Button mButton;    private static WeakReference
mWeakReference; public static void finishActivity() { if (mWeakReference != null && mWeakReference.get() != null) { mWeakReference.get().finish(); } } @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_splash); mWeakReference = new WeakReference<>((AppCompatActivity) this); mButton = (Button) this.findViewById(R.id.test_btn); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(SplashActivity.this, TestActivity.class)); } }); }}
  1. 在第二个页面中,添加 onWindowFocusChanged() 回调判断,若是第一次进入本页面时,将上一个页面手动 finish 掉,以衔接两个页面,取消时间间隔;
public class TestActivity extends AppCompatActivity {    private static final String TAG = "TestActivity";    private boolean isFirstInWindowFocusChanged = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test);    }    @Override    public void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);        Loger.e("==onWindowFocusChanged==",TAG + hasFocus);        if(hasFocus) {            if(isFirstInWindowFocusChanged){                isFirstInWindowFocusChanged = false;                SplashActivity.finishActivity();            }        }    }}

      至此,页面跳转过程中出现短时间时间间隔问题已解决,测试正常。

扩展测试

为什么要在 onWindowFocusChanged() 方法中添加是否是首次进入本页面的状态判断?

这个主要是由 Activity 的生命周期决定的,该方法主要是监测窗口是否获取或失去焦点,测试如下:

  1. 首次进入该页面,生命周期执行顺序:onCreate() -> onStart() -> onResume() -> onWindowFocusChanged()
初始化过程.png
  1. 点击 home 键,退到后台执行顺序:onPause() ->onWindowFocusChanged() -> onStop()
退居后台过程.png
  1. 从后台返回当前页面,生命周期执行顺序:onRestart() -> onStart() -> onResume() -> onWindowFocusChanged()
后台返回过程.png
  1. 退出该页面,生命周期执行顺序:onPause() ->onWindowFocusChanged() -> onStop() -> onDestroy()
销毁过程2.png

      以下是小菜公众号,欢迎闲来吐槽~

公众号

转载地址:http://wboso.baihongyu.com/

你可能感兴趣的文章
索引笔记《二》确定需要建立索引的列
查看>>
libjpeg的问题
查看>>
Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
查看>>
深度学习笔记之CNN(卷积神经网络)基础
查看>>
Hadoop 添加删除数据节点(datanode)
查看>>
ext的window如何隐藏水平滚动条
查看>>
71.8. Run level shell script to start Oracle 10g services on RedHat Enterprise Linux (RHAS 4)
查看>>
SAP QM Transfer of Inspection Stock
查看>>
全新视觉| 数治省市:SAP大数据构想一切可能
查看>>
ORACLE expdp备份与ORA-31693、ORA-02354、ORA-02149
查看>>
DBMS_STATS.GATHER_TABLE_STATS
查看>>
Java-单机版的书店管理系统(练习设计模块和思想_系列 五 )
查看>>
嵌入式 详解udev
查看>>
《C程序员:从校园到职场》出版预告(2):从“百花齐放”到“一枝独秀”
查看>>
Network Monitor 查询命令和MySQL命令
查看>>
好“戏”刚刚开幕 云计算逐步被认可
查看>>
云安全:这也是需要花大钱去建设的部分
查看>>
5G网络不止能1秒下一部电影,它还能够…
查看>>
中国电信集采终端6700万部 金额达1070亿元
查看>>
2016年的十个数据中心故事
查看>>