在我的项目中,我只使用一个Activity,所有的屏幕都是通过片段实现的。我的Activity
只控制fragment
导航,权限处理,显示提醒对话等内容。
我经常遇到这种情况。问题是,在上述所有情况下,如同请求许可,显示提醒等,Activity
和Fragment
将转到onPause
,如果我在此操作后立即转到Fragment Transaction
。我转到另一个屏幕,这意味着如果我执行Activity
,onPause
仍然会处于Activity
状态,这将导致崩溃。我必须等到resume
进入resume
州。
一个用例是,在启动画面中,我要求权限。在询问权限后,如果允许,我必须启动主屏幕,这是另一个片段。因此,在权限回调后执行的下一个代码是片段事务,并且由于权限要求dialog
返回到Activity
,因此活动需要一些时间才能返回fragment transaction
在onActivityResult
,我必须等待一段时间才能执行IllegalStateException
。
catch
发生时的情况也是如此。
目前我正在快速解决这个问题。我将一个runnable作为成员保存在Activity中,这是片段事务可运行的。我会尝试捕获onResume
并在onActivityResult
我将片段事务分配给Runnable。并且每次在活动onResume
中,如果Runnable不为null,我只是执行它。
同样适用于if let audioAssetTrack = videoAsset.tracks(withMediaType: .audio).first {
try audioTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, clipDuration), of: audioAssetTrack, at: insertTime)
if video.shouldMute {
audioMixInputParams.setVolumeRamp(fromStartVolume: 0.0, toEndVolume: 0.0, timeRange: CMTimeRangeMake(insertTime, clipDuration))
} else {
audioMixInputParams.setVolumeRamp(fromStartVolume: 1.0, toEndVolume: 1.0, timeRange: CMTimeRangeMake(insertTime, clipDuration))
}
}
。结果我将保留在一个成员中并传递给Activity belongs_to
中的片段。
但我认为这不是一个好习惯。代码看起来很丑,因为在Activity中使用了这么多成员来处理这个错误。
有没有什么好方法可以解决这个问题?
答案 0 :(得分:1)
您可以通过将片段事务与状态丢失
一起提交来解决此问题supportFragmentManager.beginTransaction()
.replace(R.id.fragment_holder, new Fragment())
.commitAllowingStateLoss()
但是如果你想保留片段的状态,你就不应该在调用onSaveInstanceState
之后进行片段交易。