显示 Fragment 时,应用程序永远冻结

Posted

技术标签:

【中文标题】显示 Fragment 时,应用程序永远冻结【英文标题】:App freezes forever when Fragment get's displayed 【发布时间】:2019-05-06 03:30:03 【问题描述】:

自从我实现了BottomAppBar 后,即使我没有更改任何内容,当某个片段应该显示时,我的应用程序也没有响应。也没有错误消息,当单击 BottomNavigationBar 中的另一个项目时显示的所有其他片段都可以正常工作。

片段:

public class StatisticsFragment extends Fragment 

private TabLayout mTabLayout;
private ViewPager mViewPager;

private BankAccountsStatisticsFragment bankAccountsStatisticsFragment = new BankAccountsStatisticsFragment();
private BillsStatisticsFragment billsStatisticsFragment = new BillsStatisticsFragment();
private CategoriesStatisticsFragment categoriesStatisticsFragment = new CategoriesStatisticsFragment();
private GoalsStatisticsFragment goalsStatisticsFragment = new GoalsStatisticsFragment();


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 

    View inflatedView = inflater.inflate(R.layout.fragment_statistics, container, false);

    mTabLayout = (TabLayout) inflatedView.findViewById(R.id.tl_statistics);
    mViewPager = (ViewPager) inflatedView.findViewById(R.id.vp_statistics);

    mViewPager.setAdapter(new Adapter(getChildFragmentManager()));
    mTabLayout.setupWithViewPager(mViewPager);

    return inflatedView;


private class Adapter extends FragmentPagerAdapter 

    private static final int TABS = 4;

    public Adapter(FragmentManager fm) 
        super(fm);
    

    @Override
    public Fragment getItem(int position) 
        switch (position)
            case 0: return bankAccountsStatisticsFragment;
            case 1: return billsStatisticsFragment;
            case 2: return categoriesStatisticsFragment;
            case 3: return goalsStatisticsFragment;
            default: throw new IllegalStateException("Couldn't find a fragment for position " + position);
        
    

    @Override
    public CharSequence getPageTitle(int position) 
        switch (position)
            case 0: return getString(R.string.tab_bank_accounts);
            case 1: return getString(R.string.tab_bills);
            case 2: return getString(R.string.tab_categories);
            default: return getString(R.string.tab_goals);
        
    

    @Override
    public int getCount() 
        return TABS;
    

LOGCAT

LOGCAT

【问题讨论】:

【参考方案1】:

膨胀布局和创建片段过渡(如“FragmentManager....replace().commit()”)是在渲染 UserInterface 的 MainThread 中完成的,因此 UserInterface 将在这些时刻冻结。 我认为您必须预先加载“坏”片段,然后将其隐藏而不是销毁它……这样下次您要创建它时就已经准备好了。

【讨论】:

但它会永远冻结,而不是在一段时间内 所以你的意思是我应该将所有片段加载到布局中并隐藏或显示应该显示的片段? 问题是关于无限冻结,而不是轻微的口吃

以上是关于显示 Fragment 时,应用程序永远冻结的主要内容,如果未能解决你的问题,请参考以下文章

将IOS应用上传到应用商店。似乎冻结和互联网停止工作

Android运行时权限中永远不会显示“不再询问”复选框

iOS 应用程序在使用 Realm 和 Crashlytics 通过 testflight 启动时冻结

线程不起作用,它冻结我的应用程序[重复]

使用协程流程->收集时房间冻结

当用户在系统设置 -> 显示和亮度上启用“粗体文本”时,iOS 应用程序在启动画面处冻结