- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更具体地说:将取消任务放在 onDestroy 中是否安全?另外,使用 onDestroy 取消注册接收器和释放资源是否安全?
我的目标是确保我的任务在 Activity 被销毁时被取消/销毁,而不是之前。
onDestroy():
第一种情况很清楚:我在 onDestroy 中进行了所有清理,没有出现任何问题。第二种情况有点问题。当 Activity 被销毁并且 onDestroy 被跳过时(所以我不会取消我的任务),任务会不会继续执行,然后完成并尝试更新死掉的 Activity,从而导致应用程序崩溃?
我们来到真正的问题:
让我们关注 onDestroy(),因为解决方案不在 onPause() 或 onStop() 中。参数:
锁屏:当设备锁屏时可以调用onPause。这种情况经常发生,就像屏幕保护程序一样,用户会立即解锁,因为他正站在那里看着屏幕。在这种情况下取消任务并停止我的应用程序正在做的一切只会降低用户体验。我不希望我的应用程序因为偶然的“屏幕保护程序”而卡住和出现异常行为。
在一个示例应用程序中,我有两个 Activity 屏幕。用户可以在它们之间快速切换。在此应用程序中,用户倾向于频繁且快速地切换屏幕。
导航:其中一个屏幕有一张 map ,可以从系统接收位置更新。它记录位置(路线)变化的精确图形日志,因此它需要不断运行,直到 Activity 关闭。通常我会在 onResume 和 onPause 中注册和取消注册任何接收器。然而,这会使应用程序非常不可用,因为每次用户导航离开时 map 上的更新都会停止。因此,我想在 onDestroy 中注销接收器。
加载列表:第二个屏幕有一个显示来自网络服务的数据的列表。下载数据需要 4 秒。我使用 AsyncTask,我知道我应该在必要时取消。它不应该在 onPause 中取消,因为它应该在用户切换屏幕时继续加载。因此,我想在 onDestroy 中取消它。
还有很多例子。在每个人看来,其中一些可能并不完全合适(您甚至可能建议使用服务而不是 AsyncTask)。但是这个想法很重要,而且他们都有相同的想法:继续做特定于 Activity 的工作,而 Activity 已暂停,但确保停止做当 Activity 被销毁时。 (无论我使用的是 AsyncTask 还是 Service 都没有关系。无论哪种情况,都应该在 Activity 被销毁时停止工作。)
附言如果答案是在 onDestroy 中进行清理是不安全的,这将意味着 Android 框架要求我们停止在 onPause 中所做的一切。然后我看不出有任何理由使用 onDestroy...
最佳答案
我想向您推荐这个宝贝:http://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int)
本质上,它为您提供了系统发现对取消任务和清理内存有用的所有地方:
请仔细查看以下 2 个案例:
TRIM_MEMORY_UI_HIDDEN - 进程一直在显示用户界面,现在不再显示了。
TRIM_MEMORY_COMPLETE - 进程接近后台 LRU 列表的末尾。
您问的大部分情况都是哪种情况。
在相同的方法中,您还可以捕获 TRIM_MEMORY_RUNNING_CRITICAL,它会提醒您系统没有内存并且必须立即采取特殊操作的情况。
这种方法让我在类似案例中的开发生活变得更好。
关于android - 在 onDestroy 中进行所有清理是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582929/
我创建了一个窗口,并在某个时候调用了 OnDestroy(),而用户从未单击关闭窗口的“关闭”或“X”按钮。 还有哪些其他操作/ Action /事物可能导致调用此函数,为什么? Microsoft
这是我的部分代码: package com.admobsdk_dfp_handler; import com.google.ads.*; import com.google.ads.doublecli
覆盖 Activity 的 ondestroy 时,我应该在 super.onDestroy() 之前或之后放置命令吗? protected void onDestroy() { //opti
我用 onDestroy()方法,我的代码没有完成: @Override public void onDestroy() { super.onDestroy();
我的代码:(用于耳机控制和更改音量) @Override public void onResume() { headSetConn=new HeadSetBCast(); regist
我正在阅读 Activity 生命周期,并阅读有关启动和销毁 Activity 的文档,链接如下: http://developer.android.com/training/basics/activ
我目前正在构建一个 Android 应用程序,它将用作防盗类应用程序。基本上,一旦警报发出,应用程序将监控加速度计以检测运动。如果是,用户将有 15 秒的时间输入设置的密码来停用警报,否则:BIIII
我在检测应用程序何时完成时遇到了一些问题。我需要在 Destroy 上执行一些操作,例如将参数保存到数据库中并最终连接到服务器。 问题是,如果我将代码放在 onDestroy 中,例如,当方向发生变化
我知道在 Android 中,您不会得到有保证的 Activity 的 onDestroy() 调用。我的问题是在哪些情况下不调用 onDestroy()? 最佳答案 假设有两个 Activity A
当我的 Activity 由于内存而被操作系统破坏时(例如,当一个电话打断它时),然后当我的 Activity 试图再次启动时,它不会返回任何预期的回调,除了 onDestroy(),我怎样才能再次恢
我无法理解 onDestroy() 的行为。我的问题是:是否有可能在不杀死 hole 应用程序的情况下不调用 onDestroy() 就杀死一个 Activity ?我的意思是,我会不会回到我的应用程
我希望当我点击手机上的后退按钮时关闭当前 Activity 并返回菜单并停止媒体播放器 但我收到错误消息:不幸的是武器已停止!单击后退按钮 那么如何解决呢? public class pushke e
我开始在我看过的两个视频类(class)中学习 android 开发,我读过的一本书说 onDestroy() 是操作系统在感觉释放内存时调用的。甚至没有人提到它会在用户关闭应用程序时被调用。这让我怀
我已经学会了如何发送推送通知,效果很好,但即使在应用程序关闭后我也需要向用户发送通知。到目前为止,我知道如何在应用程序运行时发送它。在 Android 上,当应用程序处于后台或什至关闭时,您如何发送通
为什么后桶会在父级上调用 onDestroy()? 我有以下场景: Activity A 通过 intent 打开 Activity B Intent intent = new Intent(pare
我试图在我的 OnDestroy () 中调用一个服务,但是日志都不起作用,有人知道为什么吗? @Override protected void onDestroy() { Log.e("on
嗨,这是我的代码,我试图做的是在我触摸开始出现的屏幕可绘制对象后,首先在背景 (touch2) 中出现一张图片。那么问题出在哪里呢? 问题是在我触摸屏幕之前,当我看到 touch2 图像时,如果我按下
每当我的 Activity 被终止时,我都会尝试执行一些代码,但是当它只是简单地移到后台时不会(所以只在 onPause() 中调用它不是解决方案),并且我了解不能保证调用 onDestory()。我
我要打电话 onDestroy() android 中的服务方法。 我已经在互联网上搜索了很多,很多答案都是 if 服务强制停止或以某种方式它的 onDestroy() 永远不会调用。 但我真的需要知
我正在阅读“开始 Android 4 开发”这本书,并且我正在使用按钮中的以下功能控制服务: public void startService(View view) { startServic
我是一名优秀的程序员,十分优秀!