替换 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();
}
};
}
我有 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();
}
};
}