java - ViewPager 中 fragment 之间的转换工作缓慢

标签 java android google-maps android-fragments android-viewpager

我在 ViewPager 中有 5 个 fragment 。在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 map 。我初始化为 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 fragment NotificationFragment 时,会同时创建 5 fragment ProfileFragment,也就是说,它们可以工作:

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

问题:

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

  • 是这样,但是ProfileFragment中的google map 初始化并没有延迟主线程?

更新:

我刚刚意识到Fragment的打开速度很慢,因为layout,这是因为Google Maps fragment 而不是因为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 map 时,它运行得很快。但我需要谷歌地图。那么现在该怎么办,如何解决?

最佳答案

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

关于java - ViewPager 中 fragment 之间的转换工作缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48470097/

相关文章:

java - java中如何知道何时克隆?

java - multipart/form-data 和 java.lang.NoClassDefFoundError : java. rmi.server.UID 是受限制的类

ruby-on-rails - 使用 geokit 或其他 ruby​​ gem 计算一系列地理坐标的中心

java - 如何在编码/解码 java 对象时忽略字段名

java - 使用默认值初始化数组中的对象 - java

android - volley中的JSONRequest和StringRequest有什么区别

android - Mac OS High Sierra 10.13.2 - Android 模拟器没有互联网连接

android - 单击 View 时不会触发 onClick 方法

javascript - 谷歌地图不正确的 UI 显示, map 也有一些偏移

javascript - 类型错误 : Cannot read property 'Autocomplete' of undefined in Angular 2