Android應用加載布局的時候有時候會出現重疊布局或者重疊組件--動態控制組件的顯示或者隱藏


Android應用加載布局的時候有時候會出現重疊布局或者重疊組件的情況,比如一箱項目中開屏頁之后可能會加載一個動畫(VideoView),在有網絡或者是后台返回廣告(圖片ImageView)的時候就需要進行動態控制組件的顯示或者隱藏,首先我們需要明確一些參數設置效果:

基本概念

       1、在xml文件中對控件可進行配置

       2、在Java代碼中進行設置

       可見:

               android:visibility="visible";

               Java代碼:view.setVisibility(View.VISIBLE);

       不可見:

                  android:visibility="invisible";

                  Java代碼:view.setVisibility(View.INVISIBLE);

        隱藏:

                android:visibility="gone";

                Java代碼:view.setVisibility(View.GONE);

注意:invisible--不顯示,但保留所占的空間;visible--正常顯示;gone:不顯示,且不保留所占的空間(在不顯示的時候盡量用這個,另外需要注意的是在退出Activity時候,需要在Activity生命周期(onDestry)中釋放)防止出現內存泄漏(關於內存泄漏問題可以參考我的個人博客 Android內存優化--LeakCanary使用詳解)。

今天在用leakcanary測試項目的時候,無意中在用VideoView播放本地視頻時,出現內存泄漏問題(如下圖所示),提示是AudioManager類出現的, 后面百思不得其解,因為代碼中Context沒有被長生命周期的所引用,為什么還會出現泄漏呢?


后面通過google才發現原來是setVideoPath()導致的,VideoView內部的AudioManager會對Activity持有一個強引用,而AudioManager的生命周期比較長,導致這個Activity始終無法被回收,這個bug直到2015年5月才被谷歌修復。

后面也相應的找到了解決方法,需要重寫如下方法

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new ContextWrapper(newBase) {
        @Override
        public Object getSystemService(String name) {
            if (Context.AUDIO_SERVICE.equals(name))
                return getApplicationContext().getSystemService(name);
            return super.getSystemService(name);
        }
    });
}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com