2013-10-01 7 views
0

데이터베이스에서 쿼리를 수행하는 라이브러리 함수를 구현 중이며이 쿼리는 UI 스레드에서 장시간 작업 할 때 경고 메시지가 표시 될 정도로 길기도합니다.UI 스레드에서 긴 쿼리에 대한 StrictMode 오류가 발생했습니다.

여기에 적용 할 올바른 패턴이 무엇일까요? 어떻게 결과가 동기적인 것으로 예상되는 함수에서 비동기 호출을 래핑 할 수 있습니까?

이 함수는 테이블 이름과 열을 가져오고 일반 Cursor/resolver.query pattern 기능을 사용하여 부울 값을 반환합니다. 필요한 경우 코드를 추가 할 수 있습니다.

덕분에 많이, 안드레아

답변

2

당신은 AsyncTask에 새 Thread에 의해 실행되는 간단한 Runnable에서 모든 작업을 수행 할 수 있습니다. AsyncTask은 "안드로이드 방식"입니다. 그렇지 않으면 Handler을 만들어야 Runnable (또는 Thread.run())이 결과를 UI 스레드에서 다시보고 할 수 있습니다. AsyncTask에 대한 문서에는 사용법에 대한 많은 세부 정보가 있으며 API 가이드 항목 Processes and Threads에 대한 자세한 정보가 있습니다.

+0

주 메서드가 AsyncTask가 완료 될 때까지 기다리지 않고 끝내기 때문에 AsyncTask를 실행할 수 없습니다. 나는' –

+0

(코멘트 할 수 '부울 runIfTrue (Runnable를 콜백) {{// Runnable를 콜백을 실행}}} 새로운 AsyncTask를() {(...) onPostExecute {경우 (== true의 결과를)} 생각하고 't은 더 이상 편집 할 수 없습니다.) asynctask를 실행하면 postExecute에서 콜백을 실행합니다. –

+0

@AndreaDellaCorte - 데이터베이스에서 결과를 얻는 다음 부분이 AsyncTask의 onPostExecute 메소드 (또는 onPostExecute에 의해 호출 된 메소드)에서 실행되도록 "main method"를 분할해야합니다.). –