如何在小部件(RemoteViewsService)的后台服务中正确使用AsyncQueryHandler?

时间:2019-06-07 12:18:51

标签: android android-asynctask widget remoteview

通常它很容易,只需要打电话:

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?有人有例子吗?

0 个答案:

没有答案