第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Android onWindowFocusChanged() 配合 WeakReference

標(biāo)簽:
Android

小菜最近在处理适配方面的问题,今天发现在一些低版本且性能不佳的手机上,冷启动过程中,从 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<AppCompatActivity> 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()

webp

初始化过程.png

  1. 点击 home 键,退到后台执行顺序:onPause() ->onWindowFocusChanged() -> onStop()

webp

退居后台过程.png

  1. 从后台返回当前页面,生命周期执行顺序:onRestart() -> onStart() -> onResume() -> onWindowFocusChanged()

webp

后台返回过程.png

  1. 退出该页面,生命周期执行顺序:onPause() ->onWindowFocusChanged() -> onStop() -> onDestroy()

webp

webp

销毁过程2.png



作者:阿策神奇
链接:https://www.jianshu.com/p/ca5ddf238e97


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消