- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
引用找到的 AsyncTask 文档 here ,它说:
AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.
现在我的问题出现了:为什么? doInBackground()
函数在 UI 线程之外运行,那么在这里长时间运行操作有什么危害?
最佳答案
这是一个非常好的问题,作为一个 Android 程序员需要时间来完全理解这个问题。事实上,AsyncTask 有两个相关的主要问题:
在RoboSpice里面Motivations 应用程序 (available on Google Play) 我们详细回答了这个问题。它将深入了解 AsyncTasks、Loaders、它们的特性和缺点,并向您介绍网络请求的替代解决方案:RoboSpice。网络请求是 Android 中的常见需求,本质上是长时间运行的操作.这是应用程序的摘录:
AsyncTasks 不遵循 Activity 实例的生命周期。如果您在 Activity 中启动 AsyncTask 并旋转设备,则 Activity 将被销毁并创建一个新实例。但是 AsyncTask 不会死。它将继续存在,直到完成。
当它完成时,AsyncTask 不会更新新 Activity 的 UI。事实上,它更新了 Activity 的前一个实例,不再显示。这可能导致 java.lang.IllegalArgumentException: View not attach to window manager 类型的异常,如果您例如,使用 findViewById 来检索 Activity 中的 View 。
将 AsyncTasks 创建为 Activity 的内部类非常方便。因为 AsyncTask 需要操作 View 当任务完成或正在进行时,使用 Activity 的内部类似乎很方便:内部类可以直接访问外部类的任何字段。
尽管如此,这意味着内部类将在其外部类实例上持有一个不可见的引用:Activity。
从长远来看,这会产生内存泄漏:如果 AsyncTask 持续很长时间,它会使 Activity 保持“Activity ”而Android想摆脱它,因为它不能再显示了。该 Activity 不能被垃圾收集,这是一个中心Android 在设备上保留资源的机制。
将 AsyncTasks 用于长时间运行的操作确实是一个非常非常糟糕的主意。不过,它们适用于短暂的生命周期,例如在 1 或 2 秒后更新 View 。
我鼓励您下载 RoboSpice Motivations app ,它确实深入地解释了这一点,并提供了执行某些后台操作的不同方法的示例和演示。
关于Android AsyncTask 用于长时间运行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797550/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!