Android 在FragmentActivity中替换碎片会使我的应用程序冻结5秒以上
我有一个叫做Android 在FragmentActivity中替换碎片会使我的应用程序冻结5秒以上,android,android-fragments,kotlin,android-fragmentactivity,fragmentmanager,Android,Android Fragments,Kotlin,Android Fragmentactivity,Fragmentmanager,我有一个叫做StartupActivity的FragmentActivity。此活动包含5个片段->登录片段、LostPasswordFragment、RegistrationFragment、Login2Fragment、CityPickFragment。我可以使用工具栏BackButton在片段之间切换。问题是,使用SupportFragmentManager和简单事务替换某些片段会使应用程序落后。如果单击BackButton,切换片段几乎需要5秒片段具有简单的布局,带有1图像视图2编辑文本
StartupActivity
的FragmentActivity
。此活动包含5个片段
->登录片段、LostPasswordFragment、RegistrationFragment、Login2Fragment、CityPickFragment
。我可以使用工具栏BackButton在片段之间切换。问题是,使用SupportFragmentManager和简单事务替换某些片段会使应用程序落后。如果单击BackButton,切换片段几乎需要5秒<代码>片段
具有简单的布局,带有1图像视图2编辑文本和按钮(+工具栏)
你知道会出什么问题吗
下面是片段交换工作原理的代码示例。当我在SplashScreen
之后立即启动StartupActivity
时,它将创建所有5个片段作为变量,并将默认Fragment
设置为FrameLayout container
然后,在每5个片段中都有工具栏上的“后退”按钮,我将onClickListener()
设置为,它调用parentActivity
中的方法,切换片段
我的片段有标记,因为我必须在第一个片段时禁用onBackPressed()(您不能从默认片段返回SplashScreen)
试着在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);
}
更改主线程上的片段导致该问题
编辑:在kotlin中,您可以这样使用
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();
}
};
}
你从哪里得到mHandler
?同样的问题:)因为如果我创建新的handler对象,它会说mPendingRunnable不是Runnable而是Unit(在kotlin方法mHandler.post(mPendingRunnable))@martin1337我已经更新了我的答案。它只是Handler
object,如何执行该runnable?因为如果我在函数中运行此代码,它将不会运行mHandler.post()。我必须将Runnable添加到线程中并使用.start()在默认片段的oncreate/oncreateView/onviewcreated/onresume中,您是否正在执行任何耗时的任务?不,这类似于登录屏幕。片段中唯一的内容是credentialsValidation(从RESTAPI调用asynctask到服务器)。您是否在应用程序中添加了一些背景图像?如果是,它的大小是多少,请尝试删除它并检查滞后是否消失。我将仅使用TextView创建模拟片段,并尝试用它重现问题,然后逐渐使此模拟看起来越来越像原始LoginFragment,直到发现问题为止。打开5秒的碎片不是一件平常的事情,可以安全地假设你做错了什么
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();
}
};
}