use*_*789 88 android android-asynctask
它说,在这里引用AsyncTask的文档
理想情况下,AsyncTasks应该用于短操作(最多几秒钟.)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask.
现在我的问题出现了?doInBackground函数在UI线程下运行.那么在这里长期运行会有什么危害呢?
Sni*_*las 118
这是一个非常好的问题,需要时间作为Android程序员才能完全理解这个问题.实际上,AsyncTask有两个相关的主要问题:
在RoboSpice Motivations应用程序(在Google Play上提供)中,我们会详细回答这个问题.它将深入介绍AsyncTasks,Loaders,它们的功能和缺点,并向您介绍网络请求的替代解决方案:RoboSpice.网络请求是Android中的常见要求,本质上是长期运行的操作.以下是该应用的摘录:
AsyncTasks不遵循Activity实例的生命周期.如果在Activity中启动AsyncTask并旋转设备,则将销毁Activity并创建新实例.但AsyncTask不会死.它会继续生存直到它完成.
完成后,AsyncTask将不会更新新Activity的UI.实际上,它更新了之前不再显示的活动实例.这可能导致java.lang.IllegalArgumentException类型的异常:如果您使用findViewById来检索Activity内的视图,则View不会附加到窗口管理器.
将AsyncTasks创建为活动的内部类非常方便.由于AsyncTask需要在任务完成或正在进行时操纵Activity的视图,使用Activity的内部类似乎很方便:内部类可以直接访问外部类的任何字段.
然而,这意味着内部类将在其外部类实例上保存一个不可见的引用:Activity.
从长远来看,这会产生内存泄漏:如果AsyncTask持续很长时间,它会使活动保持"活着",而Android则希望摆脱它,因为它无法再显示.该活动不能被垃圾收集,这是Android在设备上保留资源的核心机制.
对于长时间运行的操作使用AsyncTasks确实是一个非常糟糕的主意.然而,它们适用于短期生活,例如在1或2秒后更新视图.
我鼓励您下载RoboSpice Motivations应用程序,它真正深入地解释了这一点,并提供了进行某些后台操作的不同方法的示例和演示.
Com*_*are 38
为什么?
因为AsyncTask
,默认情况下,使用您未创建的线程池.永远不要从未创建的池中占用资源,因为您不知道该池的要求是什么.如果该池的文档告诉您不要,那么永远不要从您未创建的池中占用资源,就像这里的情况一样.
特别是,从Android 3.2开始,AsyncTask
默认情况下使用的线程池(对于android:targetSdkVersion
设置为13或更高的应用程序)只有一个线程 - 如果你无限期地占用这个线程,你的其他任务都不会运行.
归档时间: |
|
查看次数: |
27785 次 |
最近记录: |