commitAllowingStateLoss() 和 commit() 片段

2024-01-11

我想在网络后台操作后提交一个片段。我在成功的网络操作后调用 commit() ,但如果活动进入暂停或停止状态,它就会导致应用程序崩溃,并显示 IllegalState 异常。

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

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

网络操作处理活动暂停和停止状态后处理提交片段的方法是什么?


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

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

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

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

但是,用户做了一些事情,您正在尝试在网络上获取信息,信息已准备好,并且您必须在用户恢复应用程序时显示它......主要词是“resume".

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

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

附加信息: 这个话题 https://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit尤其是@jed 的回答,以及@pjv、@Sufian 的评论。这个博客 http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html为了了解错误发生的原因,以及为什么提议/接受的答案有效。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

commitAllowingStateLoss() 和 commit() 片段 的相关文章

  • EditText 中的验证允许 IP 或 Web Url 主机

    我需要对我的 EditText 进行验证 以便它允许我输入有效的 IP 地址格式 即示例 132 0 25 225 or 网址格式 www 例如 www example com 逻辑是 如果用户首先输入任何数值 则验证 IP 将执行操作 否
  • 单击 RecyclerView 内的 ImageView 时更改图像资源

    每当我单击它时 单击图像 而不是项目 我都会尝试更改回收器视图内特定位置的设备图像资源 我尝试将 setOnClickListener 放入 onBindViewHolder 方法中 但只有最后一个项目受到影响 这是我的回收者视图 http
  • 如何检测和管理来电(Android)?

    我想创建一个应用程序 可以检测来电并在一定数量的蜂鸣声 响铃 后启动我的自定义活动 我的意思是在 2 或 3 或 5 声蜂鸣声 响铃 后我的activity被触发 我该怎么做 Thanks 我认为您无法计算自来电开始以来电话响了多少次 无法
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • 如何将 EditText 传递给另一个活动?

    Intent intent new Intent this Name class intent putExtra key et getText toString startActivity intent Intent intent getI
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • React Native Android 发布 apk 是调试,而不是发布

    我有一个现有的 Android 应用程序 我已根据以下内容将 React Native v0 30 活动添加到项目中docs http facebook github io react native releases next docs i
  • 如何在 Android 上创建 YouTube 的双击手势?

    我在 Android 上有 exoplayer 的应用程序 我已经创建了 youtube双击手势用动画向前或向后跳跃 10 秒 如何在双击时创建具有波纹效果的半圆 像这样 这个怎么做 我也想实现这样的功能 所以我自己编写了它来 复制 You
  • 使用 Android 播放任意音调

    有没有办法让Android发出任意频率的声音 意思是 我不想预先录制声音文件 我环顾四周 音调发生器 http developer android com reference android media ToneGenerator html
  • 如何在 iOS 应用程序中通过其他应用程序共享内容/数据,就像我们在 Android 应用程序中使用 Intent.ACTION_SEND 所做的那样?

    在Android中 我们可以通过Intent ACTION SEND startactivity api轻松共享内容 文本 图像 视频等 我已经有一个应用程序可以完美地做到这一点 并且有一个并行的 iOS 应用程序 我希望它能够实现相同的功
  • Android模拟器分配内存失败8

    当我尝试从 Eclipse 运行 WXGA800 模拟器时 出现如下错误 Failed to allocate memory 8 This application has requested the Runtime to terminate
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • Ionic Facebook Api 无效密钥哈希

    我无法让我的应用程序允许 Facebook 登录 每次用户尝试登录 Facebook 并使用他们的 FB 验证我的应用程序时 都会出现以下错误 无效的密钥哈希 它们的密钥哈希 xxxxxxxxxx 与任何存储的密钥哈希不匹配 配置您的应用程
  • 不显示 WRITE_EXTERNAL_STORAGE 的权限对话框

    I want to download a file using DownloadManager And DownloadManager wants to WRITE EXTERNAL STORAGE permission I have in
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 在 Android 中上传文件出现内存不足错误

    我的上传代码如下 String end r n String twoHyphens String boundary try URL url new URL ActionUrl HttpURLConnection con HttpURLCon
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • Android ADT Eclipse 插件,parseSDKContent 失败

    我刚刚设置了我的第一个 Android 开发环境 其中包括 日食3 5 Mac OS X 10 5 适用于 x86 mac 的 Android SDK ADT Eclipse 插件 0 9 6 我已将 set PATH 设置为我的 SDK

随机推荐