gpt4 book ai didi

android - commitAllowingStateLoss() 和 commit() fragment

转载 作者:IT王子 更新时间:2023-10-28 23:36:55 26 4
gpt4 key购买 nike

我想在网络后台操作后提交一个 fragment 。我在成功的网络操作后调用了 commit(),但如果 Activity 进入暂停或停止状态,它会导致应用程序崩溃,说 IllegalState 异常。

所以我尝试使用 commitAllowingStateLoss() 并且它现在工作正常。

我浏览了一些博客和文章,它说 commitAllowingStateLoss() 不好用。

网络操作处理 Activity 暂停和停止状态后提交 fragment 的处理方式是什么?

最佳答案

我想向 Aritra Roy 添加信息(到目前为止,我读到,这是一个非常好的答案)。

我之前遇到过这个问题,我发现主要问题是你试图在另一个线程中进行一些异步操作(HTTP,计算,...),这是一个很好的做法,但你必须通知你的用户收到答案后。

主要问题是,由于它是异步操作,因此无法保证用户仍然在您的 Activity/应用上。如果他走了,就没有必要进行 UI 更改。此外,由于 android 可能会因内存问题而终止您的应用程序/Activity ,因此您无法保证能够获得答案并将其保存以进行恢复。问题不仅在于“用户可以打开另一个应用程序”,还在于“我的 Activity 可以从配置更改中重新创建”,并且您可能正在尝试在 Activity 重新创建期间进行 UI 更改,这非常非常糟糕。

使用“commitAllowingStateLoss”就像是在说“我不在乎 UI 是否真的处于良好状态”。你可以为一些小事做这件事(比如激活一个 gif 说明你的下载结束)......这不是一个大问题,这个问题并不值得处理,因为“一般”用户会留在你的应用程序上。

但是,用户做了一些事情,你试图在网络上获取信息,信息已经准备好,当用户恢复应用程序时你必须显示它......主要是“resume”。

您必须将所需的数据收集到一个变量中(如果可以的话,一个可打包或原始变量),然后按以下方式覆盖您的“onResume”或“onPostResume”(用于 Activity )函数。

public void onResume/onPostResume() {
super.onResume/onPostResume();
if(someTreatmentIsPending) {
/*do what you need to do with your variable here : fragment
transactions, dialog showing...*/
}
}

其他信息: This topic尤其是@jed 的回答,以及@pjv、@Sufian 对它的评论。 This blog为了了解为什么会出现错误,以及为什么建议/接受的答案有效。

最后一句话:以防万一您想知道“为什么使用服务比 asyncTask 更好”。据我了解,这并不是更好。主要区别在于正确使用服务允许您在 Activity 暂停/恢复时注册/取消注册处理程序。因此,当您的 Activity 处于 Activity 状态时,您总能得到答案,从而防止错误发生。

请注意,这并不是因为错误没有发生就说明您是安全的。如果您直接在 View 上进行更改,则不涉及 fragmentTransactions,因此,不能保证在重新创建、恢复、重新启动应用程序或其他任何操作时会保留并重新创建更改。

关于android - commitAllowingStateLoss() 和 commit() fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42688194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com