gpt4 book ai didi

android - 应用启动时预加载一些 fragment

转载 作者:太空狗 更新时间:2023-10-29 14:10:20 26 4
gpt4 key购买 nike

我有一个带有抽屉导航的 Android 应用程序。我的问题是某些 fragment 需要几秒钟才能加载(解析器、Map API)。我想在应用启动时加载我的所有 fragment 。

我不确定这样做是否可行或好方法,但我正在考虑在主要 Activity 的 onCreate 方法中为我的每个 fragment 创建一个实例。然后,当用户在抽屉导航中选择 fragment 时,我使用现有实例而不是创建新实例。

问题是它不能防止我第一次显示特定 fragment 时出现延迟。在我看来,原因是 fragment 构造函数没有做很多操作。

在网络上搜索后,我找不到在应用程序启动时“预加载” fragment 的优雅方式(而且不是用户在抽屉中选择项目时)。

一些帖子谈到了AsyncTask,但看起来MapFragment操作只能在主线程中执行(我尝试时出现异常:java.lang.IllegalStateException:不在主线程中)。

这是我到目前为止尝试过的:

mFragments = new Fragment[BasicFragment.FRAGMENT_NUMBER];
mFragments[BasicFragment.HOMEFRAGMENT_ID] = new HomeFragment();
mFragments[BasicFragment.CAFEFRAGMENT_ID] = new CafeFragment();
mFragments[BasicFragment.SERVICEFRAGMENT_ID] = new ServiceFragment();
mFragments[BasicFragment.GOOGLEMAPFRAGMENT_ID] = new GoogleMapFragment();

当在抽屉导航中选择一个项目时:

private void selectItem(int position) {

Fragment fragment = mFragments[position];

// here, I check if the fragment is null and instanciate it if needed

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();

mDrawerList.setItemChecked(position,true);
mDrawerLayout.closeDrawer(mDrawerList);
}

我也试过this solution ;它允许防止 fragment 被加载两次(或更多),但它不能防止我的应用程序在我第一次显示它时出现滞后。这就是为什么我尝试在应用程序启动时加载所有 fragment (使用启动画面或其他东西)以防止进一步延迟。

感谢您的帮助/建议。

最佳答案

您可以将 fragment 放入 ViewPager。它默认预加载 2 个页面( fragment )。您还可以增加预加载页面( fragment )的数量

mViewPager.setOffscreenPageLimit(int numberOfPreloadedPages);

但是,您将需要重写您的 showFragment 方法并重写返回堆栈逻辑。

关于android - 应用启动时预加载一些 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29501858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com