配置更改时,我的Android应用程序崩溃



I am Creating a timer app withTabLayout一个选项卡是timer using a classCountDownTimer,另一个选项卡则是Stopwatch using a classChronometerusing aMVVMarchitecture。该应用程序在纵向模式下正常工作。当我旋转屏幕时,应用程序崩溃了。logcat日志如下所示。

2020-11-07 08:28:59.190 29332-29332/com.mpvaitheeswaran.timeranker D/AndroidRuntime: Shutting down VM
2020-11-07 08:28:59.199 29332-29332/com.mpvaitheeswaran.timeranker E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mpvaitheeswaran.timeranker, PID: 29332
java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1778)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1814)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:297)
at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(FragmentStateAdapter.java:726)
at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer$3.onStateChanged(FragmentStateAdapter.java:657)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:361)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:300)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:339)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:145)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:131)
at androidx.fragment.app.Fragment.performStart(Fragment.java:2735)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2583)
at androidx.fragment.app.Fragment.performStart(Fragment.java:2739)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:365)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1194)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:2583)
at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:258)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:550)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
at android.app.Activity.performStart(Activity.java:7165)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2975)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

查看我的此项目的完整来源https://github.com/mpvaitheeswaran/TimeRanker/tree/withTabLayout

现在我使用Handler解决了这个问题。这个问题是在创建ViewPagerAdapter时发现的。

如果不使用线程,配置更改时应用程序将崩溃。

viewPagerAdapter=new ViewPagerAdapter(fragments,
requireActivity().getSupportFragmentManager(),
getLifecycle());
viewPager.setAdapter(viewPagerAdapter);
new TabLayoutMediator(tabLayout,viewPager,(tab, position) -> {
//TODO Implement tab Something
switch (position){
case 0:
tab.setText("Timer");
break;
case 1:
tab.setText("Stopwatch");
break;
}
}).attach();

使用线程,应用程序工作正常。

//The Handler is very important one Without thread the app crash when the configuration changes.
Handler handler =new Handler();
handler.post(new Runnable() {
@Override
public void run() {
viewPagerAdapter=new ViewPagerAdapter(fragments,
requireActivity().getSupportFragmentManager(),
getLifecycle());
viewPager.setAdapter(viewPagerAdapter);
new TabLayoutMediator(tabLayout,viewPager,(tab, position) -> {
//TODO Implement tab Something
switch (position){
case 0:
tab.setText("Timer");
break;
case 1:
tab.setText("Stopwatch");
break;
}
}).attach();
}
});

当配置更改时,此应用程序不需要恢复数据,因为我使用ViewModel从CountDownTimer获取数据。

Chronometer需要它,我很快就会修复这个错误。

相关内容

最新更新