替换 FragmentActivity 中的片段会冻结我的应用程序超过 5 秒

Replacing fragments in FragmentActivity is freezing my application for more than 5 seconds

我有 FragmentActivity 呼叫 StartupActivity。这个 activity 包含 5 Fragments -> LoginFragment, LostPasswordFragment, RegistrationFragment, Login2Fragment, CityPickFragment。我可以使用 ToolBar BackButton 在片段之间切换。问题是,使用 suppportFragmentManager 和简单事务替换某些片段会使应用程序滞后。如果我单击 BackButton,切换片段需要将近 5 秒 Fragments 布局简单 1 ImageView 2 EditTexts 和按钮 (+ ToolBar)

你知道什么是错误的吗?

这是片段切换工作原理的代码示例。当我在 SplashScreen 之后立即开始 StartupActivity 时,它将创建所有 5 个片段作为变量,并将默认 Fragment 设置为 FrameLayout 容器.

然后在每5个片段中是工具栏中的后退按钮,我将调用parentActivity中的方法的onClickListener()设置为切换片段

我的片段有 标签,因为我必须在第一个片段中禁用 onBackPressed()(你不能从默认返回到 SplashScreen片段).

//RegistrationFragment
fragmentBackButton.setOnClickListener {
            (activity as StartupActivity).switchToDefaultLoginFragment()
        }

//StartupActivity
fun switchToDefaultLoginFragment(){
        fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.apply {
            replace(R.id.startup_fragment_container, defaultLoginFragment, "LOGIN_FRAGMENT")
            addToBackStack(null)
            commit()
        }
    }

尝试在 Runnable 中执行您的代码。像这样

Handler  mHandler = new Handler();

     Runnable mPendingRunnable = new Runnable() {
                @Override
                public void run() {
                    // update the main content by replacing fragments
                    Fragment fragment = getHomeFragment();
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,
                            android.R.anim.fade_out);
                    fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG);
                    fragmentTransaction.commitAllowingStateLoss();
                }
            };

            // If mPendingRunnable is not null, then add to the message queue
            if (mPendingRunnable != null) {
                mHandler.post(mPendingRunnable);
            }

在导致该问题的主线程上更改您的片段

编辑:在科特林中你可以这样使用

private var   mDelayHandler : Handler? = Handler()
 mDelayHandler!!.post(mRunnable)


internal val mRunnable: Runnable = Runnable {
        Fragment fragment = getHomeFragment();
                        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,
                                android.R.anim.fade_out);
                        fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG);
                        fragmentTransaction.commitAllowingStateLoss();
                    }
                };
    }