ViewPager 中片段之间的转换工作缓慢



我在ViewPager中有 5 个片段。在MainActivity中初始化ViewPager

private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
CalendarFragment scheduleFragment = new CalendarFragment(); // this should be in getItem()
ServicesFragment servicesFragment = new ServicesFragment(); // this should be in getItem()
ReviewsFragment reviewsFragment = new ReviewsFragment(); // this should be in getItem()
NotificationFragment notificationFragment = new NotificationFragment(); // this should be in getItem()
ProfileFragment profileFragment = new ProfileFragment(); // this should be in getItem()
viewPagerAdapter.addFragment(scheduleFragment); // this line can cause crashes
viewPagerAdapter.addFragment(servicesFragment); // this line can cause crashes
viewPagerAdapter.addFragment(reviewsFragment); // this line can cause crashes
viewPagerAdapter.addFragment(notificationFragment); // this line can cause crashes
viewPagerAdapter.addFragment(profileFragment); // this line can cause crashes
viewPager.setAdapter(viewPagerAdapter);
}

ProfileFragment我与google Maps一起工作.我初始化为onCreateView()

if (mMap == null) {
final OnMapReadyCallback mapListener = this;
new Handler().postDelayed(() -> {
if (isAdded()) {
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(mapListener);
}
}, 1000);
}  

尝试在onViewCreated()onResume()上初始化,结果是一样的。

所以问题是当我按 5 个菜单项中的 4 个时,它会挂起半秒钟。因为当您单击时 4 片段NotificationFragment,同时创建一个 5 片段ProfileFragment,也就是说,它们工作:

D/== Profile Fragment ==: onAttach()
D/== Profile Fragment ==: onCreateView()
D/== Profile Fragment ==: onViewCreated()
D/== Profile Fragment ==: onResume()

问题:

  • 是否可以确保当您单击菜单项时,仅触发与我单击的此fragment相关的那些方法,并且接下来找不到与之一起初始化的fragments

  • 左右,但是ProfileFragment中的谷歌地图初始化并没有延迟主线程?

上级:

我刚刚意识到Fragment的打开很慢是因为layout,那是因为Google Maps碎片而不是因为OnMapReadyCallback

<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

当我从layout.xml中删除google maps时,它的工作速度很快。但我需要google maps.那么现在怎么办,怎么解决呢?

您可以使用viewPagerAdapter.setOffscreenPageLimit(2);,这将缓存未使用的片段

使用视图寻呼机时的默认屏幕外限制为1。这意味着紧邻片段将始终被缓存。滞后是因为当您打开旁边的片段时,ProfileFragment也是初始化的。

仅当片段对用户可见时,您才能覆盖setUserVisibleHint以初始化此片段中的内容。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// load map
}
}

最新更新