我正在使用AsyncQueryHandler
,一旦查询完成,它将调用onQueryComplete
。
我的问题是: onQueryComplete
是否在UI线程上调用?
我知道它会在后台执行查询。
AsyncQueryHandler
实例化的位置是否重要?(如果在UI线程中实例化,则意味着onQueryComplete
将在UI线程上调用)。
我正在使用AsyncQueryHandler
,一旦查询完成,它将调用onQueryComplete
。
我的问题是: onQueryComplete
是否在UI线程上调用?
我知道它会在后台执行查询。
AsyncQueryHandler
实例化的位置是否重要?(如果在UI线程中实例化,则意味着onQueryComplete
将在UI线程上调用)。
onQueryComplete
在 UI 线程上调用吗?
它是在 调用 线程上调用的... 所以是在启动 AsyncQueryHandler
的线程上。
实例化
AsyncQueryHandler
的位置有关系吗?
AsyncQueryHandler
是 Handler
的子类,执行异步查询(或插入、更新、删除)到 ContentResolver
并将结果返回给调用线程。 Handler
允许与主 UI 线程之外的其他线程相关联,因此对 ContentResolver
的查询/事务也是如此。因此,您应该允许从单独的线程调用 AsyncQueryHandler
。
话虽如此,出于以下几个原因,这样做可能不是您想要的:
当你在单独的线程上实例化AsyncQueryHandler
时,所有后续的回调都将返回到该调用线程。这通常不是你想要的,因为它没有提供一种简单的方法与主UI线程同步,主UI线程负责创建布局和接收触摸事件。
您已经在一个单独的线程上,因此对ContentResolver
的调用已经相对于UI线程是异步的。
顺便说一下,关于这些点,AsyncQueryHandler
的文档没有提到任何内容,但通过阅读源代码,您可以找出大部分内容。 {{link2: Handler
}}(其直接基类)的文档也解释了其背后的原理。