Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在FragmentActivity中替换碎片会使我的应用程序冻结5秒以上_Android_Android Fragments_Kotlin_Android Fragmentactivity_Fragmentmanager - Fatal编程技术网

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();
                    }
                };
    }