2013-10-01 2 views
0

Я реализую библиотечную функцию, которая выполняет запрос в базе данных, и этот запрос может когда-то быть достаточно длинным, чтобы вызвать предупреждение StrictMode для длительной операции в потоке пользовательского интерфейса.Ошибка Android StrictMode для длинного запроса в потоке пользовательского интерфейса

Мне было интересно, что бы это был правильный шаблон для применения здесь? Как я могу обернуть асинхронный вызов в функции, результат которой будет синхронным?

Функция получает имя таблицы и столбец и возвращает логическое значение, используя обычные функции Cursor/resolver.query pattern. При необходимости я могу добавить код.

Спасибо большое, Andrea

ответ

2

Вы можете сделать что-нибудь от простого Runnable выполняемого новой Thread к AsyncTask. AsyncTask - это «Android-способ»; в противном случае вам нужно создать Handler, так что Runnable (или Thread.run()) может сообщать о результатах в потоке пользовательского интерфейса. В документах для AsyncTask есть много подробностей об использовании, а в руководстве по API Processes and Threads содержится дополнительная информация.

+0

AsyncTask не может быть осуществимым, потому что основной метод просто выйдет, не дожидаясь завершения AsyncTask. Я имею в виду 'логическое runIfTrue (Runnable обратного вызова) { новый AsyncTask() {(...) onPostExecute {если (результат == TRUE) {// запустить Runnable обратного вызова}}}}' –

+0

(Комментарий может больше не редактируем) Затем я выполнил бы асинтаску, и он, в свою очередь, запустил бы обратный вызов в postExecute. –

+0

@AndreaDellaCorte - вам нужно разделить свой «основной метод», чтобы часть, которая следует за получением результата из базы данных, выполнялась в методе 'onPostExecute'' AsyncTask' (или в методе, называемом 'onPostExecute'). –

Смежные вопросы