产生耗时的计算线程是很常见的。稍后我们需要更新Activity
or Fragment
与计算结果。
我一直遵循以下准则。到目前为止,它对我来说效果很好。
AsyncTask需要onPostExecute UI Fragment
- Use
setRetainInstance(true)
无 UI 片段。
- Use
setTargetFragment
and getTargetFragment
技术
- 请参阅https://stackoverflow.com/a/12303649/72437 https://stackoverflow.com/a/12303649/72437
AsyncTask需要onPostExecute UI Activity
- Use
setRetainInstance(true)
无 UI 片段。
- Use
onAttach
and onDetach
存储参考Activity
。 Google 似乎不鼓励使用getActivity
. http://developer.android.com/guide/components/fragments.html http://developer.android.com/guide/components/fragments.html
- 请参阅https://stackoverflow.com/a/16305029/72437 https://stackoverflow.com/a/16305029/72437
但是,派生自的类的情况如何?View
?我计划推出AsyncTask
从习俗View
。然而,我怎样才能onPostExecute
回到View
?
我这么问的原因是,在我的自定义视图中,某些触摸事件将触发它使用新的位图重新绘制自身。生成新位图非常耗时。因此,我计划启动一个 AsyncTask,来生成这样的位图,然后传递回自定义视图。但是,配置更改可能会导致重新创建自定义视图。因此,我需要确保我的 AsyncTask 在执行期间可以有正确的视图引用onPostExecute
.
假设您正在使用AsyncTask
仅适用于与绘图相关的操作(否则您应该真正重新审视您的逻辑 - 正如评论所建议的那样),您可以创建AsyncTask
直接在您的自定义中View
class:
class MyView extends View {
private MyAsyncTask currentTask = null;
// View details
@Override
public void onAttachedToWindow() {
currentTask = new MyAsyncTask(this);
currentTask.execute();
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (currentTask != null) {
currentTask.cancel(true);
currentTask = null;
}
}
static class MyAsyncTask extends AsyncTask<Void, Void, Bitmap> {
private WeakReference<MyView> viewRef;
MyAsyncTask(MyView view) {
viewRef = new WeakReference<>(view);
}
// background task implementation
@Override
public void onPostExecute(Bitmap bitmap) {
MyView view = viewRef.get();
if (view == null) {
return;
}
// you now can safely update your view - we're on UI thread
}
}
}
这就是安全实施的样子。它有一些缺点和重要部分:
- 在任何时候你的
AsyncTask
应该强烈引用View
(这就是为什么类被声明为static
并持有WeakReference
to View
)
- 当你对结果不感兴趣时
AsyncTask
不再 - 取消它
- 此实现只会丢弃取消的可能有用的结果
AsyncTask
。如果这是问题所在 - 我建议删除AsyncTask
from View
完全并寻找其他解决方案(单独Executor
or HandlerThread
).
Also onPostExecute
of AsyncTask
将从启动它的同一个循环线程中调用(在您的情况下,这是主线程,所以如果您从Activity
or View
,或其他任何地方,这完全取决于管理这些任务的难度)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)