Как правильно использовать AsyncQueryHandler в фоновом режиме в виджете (RemoteViewsService)? - PullRequest
0 голосов
/ 07 июня 2019

Обычно это просто, нужно просто позвонить:

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);

и все.Но это можно вызвать только в рамках действия.

Мое приложение - это виджет, и мне нужно обновить его из фона.Нет потока пользовательского интерфейса, только фоновое обновление службы удаленного адаптера.Как только я пытаюсь создать 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 на фоне, внутри виджета (служба удаленных просмотров)?У кого-нибудь есть пример?

...