我有一个活动,它将启动的任何AsyncTask添加到矢量列表。
当活动被销毁时,它会遍历vector-list并在所有AsyncTasks上调用onCancelled。
因此,在每个AsyncTask中调用OnCancelled,将一些私有字段设置为null。这些私有字段引用了活动拥有的某些对象。这与AsyncTasks一起检查“isCancelled”这意味着AsyncTasks将以干净的方式停止。每个AsyncTask都有一个对vector-list的引用。
这留下了一些遗留问题:
由于AsyncTask过去曾经咬过我:对于以下问题,API> = 8的行为一致是什么?
我假设只有在调用 cancel 时才会调用 onCancelled 。这意味着在这种情况下,让活动维护vector-list并在AsyncTask中简单地取消对它的引用是合理的吗?
在AsyncTask后代中,onCancelled在哪个线程中运行? AsyncTask一个或主要的ui活动呼叫“取消”? (这对于将私有字段归零的线程安全很重要)
每个AsyncTask在完成和销毁时是否应该从列表中找到并删除它自己?假设析构函数在AsyncTask线程中运行,我是否只需要同步查找/删除操作?
答案 0 :(得分:2)
1)我在AsyncTask中所知道的唯一不一致是执行真正并行而不是在单个线程上循环并且executeOnExecutor是真正并行的。
2)是的,只有在调用cancel时才调用onCancelled。但是请注意文档:在调用cancel(boolean)并且doInBackground(Object [])完成后在UI线程上运行。
这意味着不会在任何线程上立即调用onCancelled。
3)UI线程,根据文档
4)Java没有析构函数。它有终结器,可能永远不会被调用,或者可能在4天之后调用。你不能依赖它们。