【发布时间】:2014-11-13 16:02:36
【问题描述】:
产生一个耗时的计算线程是很常见的。稍后,我们需要用计算结果更新Activity 或Fragment。
一直以来,我都遵循以下准则。到目前为止,它对我来说效果很好。
AsyncTask 需要 onPostExecute UI Fragment
- 使用
setRetainInstance(true)无 UI 片段。 - 使用
setTargetFragment和getTargetFragment技术 - 请参考https://stackoverflow.com/a/12303649/72437
AsyncTask 需要 onPostExecute UI Activity
>- 使用
setRetainInstance(true)无 UI 片段。 - 使用
onAttach和onDetach存储对Activity的引用。谷歌似乎不鼓励使用getActivity。 http://developer.android.com/guide/components/fragments.html - 请参考https://stackoverflow.com/a/16305029/72437
但是,从View 派生的类的大小写如何?我计划从自定义View 启动AsyncTask。但是,我怎样才能onPostExecute 回到View?
我这样问的原因是,在我的自定义视图中,某些触摸事件会触发它使用新的位图重绘自身。生成新位图非常耗时。因此,我计划启动一个 AsyncTask,生成这样的位图,然后传回自定义视图。但是,配置更改可能会导致重新创建自定义视图。因此,我需要确保我的 AsyncTask 在onPostExecute 期间可以有正确的视图引用。
【问题讨论】:
-
您是否询问如何在配置更改期间保留位于
View内部的AsyncTask? -
不,不,不......视图派生类不应该知道线程之类的东西甚至存在......它们也不应该能够自己获取数据,它们应该被“喂食” ...所以最佳做法是:根本不要这样做
-
@Selvin 我不会说视图永远不应该知道线程。 Romain Guy 甚至给出了一个视图示例,该视图需要在自定义视图的this Google IO talk 中清理其线程(参见 5:59)。也就是说,你是对的,在很多情况下,将线程放在活动/片段中可能是更好的编程设计。这仅取决于用例。
-
@AlexLockwood 有点像。在我的自定义视图中,某些触摸事件会触发它使用新的位图重绘自身。生成新位图非常耗时。因此,我想知道正确的方法,从自定义视图中正确管理线程。一直以来,我从 Activity & Fragment 管理线程。但是,我从来没有在自定义视图上这样做过。
-
视图对配置更改一无所知...这是活动和片段应该担心的事情。如果必须保留视图的线程真的,则必须将该逻辑上移到活动/片段中(或在服务中生成位图等)。
标签: android android-fragments android-asynctask