crobotvip
native层内存占用忽高忽低,跟页面白屏没有关系,在反复排查之后
一开始以为是内存占用,确实应用在使用过程中越来越卡。但这个跟之前的页面后台之后图片自动释放有关系。
通过页面替换,我发现这个东西跟内存占用过高,没有半毛钱关系。因为即使页面上啥都没有。native层的内存不稳定依然会出现,而且是大概率复现。但是并不影响使用
tabbar切换过程中的页面切换,导致的页面白屏的最终原因定位到了,原因是我重写组件造成的
1.我重写了tabbarPageView 使用了SmartRefreshLayout
public class AirTabbarPageView extends SmartRefreshLayout {
private TabbarBean mTabbarBean = new TabbarBean();
public AirTabbarPageView(Context context) {
super(context);
initSetting(context);
}
private void initSetting(Context context) {
setRefreshHeader(new ClassicsHeader(context));
}
public AirTabbarPageView(Context context, AttributeSet attrs) {
super(context, attrs);
initSetting(context);
}
public void setBarBean(TabbarBean barBean) {
mTabbarBean = barBean;
}
public TabbarBean getBarBean() {
return mTabbarBean;
}
}
重写了这个组件其实并不足以让页面切换出现白屏的情况。最终导致这个问题是再页面切换的时候使用了eeui.setStatusBarStyle方法。
关于setStatusBarStyle的原生实现如下:
@TargetApi(Build.VERSION_CODES.M)
public static void setLightMode(Activity activity, boolean flagVisible) {
// setMIUIStatusBarDarkIcon(activity, true);
// setMeizuStatusBarDarkIcon(activity, true);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | (flagVisible ? View.SYSTEM_UI_FLAG_VISIBLE : View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN));
// }
QMUIStatusBarHelper.setStatusBarLightMode(activity);
}
@TargetApi(Build.VERSION_CODES.M)
public static void setDarkMode(Activity activity, boolean flagVisible) {
// setMIUIStatusBarDarkIcon(activity, false);
// setMeizuStatusBarDarkIcon(activity, false);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// activity.getWindow().getDecorView().setSystemUiVisibility(flagVisible ? View.SYSTEM_UI_FLAG_VISIBLE : View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
// }
QMUIStatusBarHelper.setStatusBarDarkMode(activity);
}
注释部分是原有的实现,注释后的代码是我根据之前的经验,使用了腾讯QMUI库的状态栏颜色修改方案。
activity.getWindow().getDecorView().setSystemUiVisibility
这个方法是导致页面白屏问题出现的一个原因。我跟踪了里面的源码
public void setSystemUiVisibility(int visibility) {
if (visibility != mSystemUiVisibility) {
mSystemUiVisibility = visibility;
if (mParent != null && mAttachInfo != null && !mAttachInfo.mRecomputeGlobalAttributes) {
mParent.recomputeViewAttributes(this);
}
}
}
我估计是这个 mParent.recomputeViewAttributes(this);重新计算视图属性方法造成的这个页面白屏。有知道原因的大佬可以回复我一下