通常它很容易,只需要打电话:
AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver()) {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// finished
}
}
// call on background
handler.startQuery(1, null, builder.build(), projection, selection, args, sort);
差不多就可以了。但这只能在活动中调用。
我的应用是窗口小部件,我需要从后台对其进行更新。没有UI线程,只有后台服务正在更新remoteviews适配器。一旦尝试在后台创建AsyncQueryHandler
,它就会引发异常:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast.<init>(Toast.java:68)
at android.widget.Toast.makeText(Toast.java:231)
很好,但是当我在创建Looper.prepare()
之前调用AsyncQueryHandler
时,然后在尝试调用方法onQueryComplete
时它又崩溃了,因为“小部件更新”线程已经完成:
W/MessageQueue: Handler (android.os.Handler) {b27f7cf} sending message to a Handler on a dead thread
java.lang.IllegalStateException: Handler (android.os.Handler) {b27f7cf} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
at android.os.Handler.enqueueMessage(Handler.java:643)
at android.os.Handler.sendMessageAtTime(Handler.java:612)
那么如何在后台在小部件(远程视图服务)中正确使用AsyncQueryHandler?有人有例子吗?