AsyncQueryHandler在ui线程上调用onQueryComplete?(Android)

use*_*828 2 multithreading android android-loadermanager android-handler

我正在使用,AsyncQueryHandleronQueryComplete在查询完成后调用它.

我的问题:onQueryComplete在UI线程上调用?

我知道它在后台进行查询.

在哪里AsyncQueryHandler实例化是否重要?(如果在UI线程中实例化将意味着onQueryComplete将在UI线程上调用).

Ale*_*ood 6

onQueryComplete呼吁UI线程?

它在调用线程上调用 ...所以你启动它的线程AsyncQueryHandler.

在哪里AsyncQueryHandler实例化是否重要?

AsyncQueryHandler是一个子类,Handler它执行异步查询(或插入,更新,删除)ContentResolver并将结果返回给调用线程.Handler允许s与主UI线程以外的线程相关联,查询/事务也是如此ContentResolver.因此,您也应该被允许AsyncQueryHandler从单独的线程调用.

话虽这么说,这样做可能不是你想要的几个原因:

  1. 当您AsyncQueryHandler在单独的线程上实例化时,所有后续回调都将返回到该调用线程.这通常不是您想要的,因为它不提供与主UI线程同步的简单方法,主线程负责创建布局和接收触摸事件.

  2. 您已经在一个单独的线程上,因此ContentResolver对于UI线程的调用已经是异步的.

顺便说一句,文档AsyncQueryHandler中没有提到关于这些要点的任何内容,但是你可以通过阅读源代码来解决大部分问题.Handler(其直接基类)的文档也解释了它背后的理论.