2011-03-02 4 views
3

내 문제는 Android와 관련이 있습니다. 다음 코드 (비 관련 부분은 생략) 한 :Android : SQLiteCursor/SimpleCursorAdapter in background

public class MyActivity extends ListActivity { 
    protected void onResume() { 
     super.onResume(); 
     new UpdateTask().execute(); 
    } 

    private class UpdateTask extends AsyncTask<Object, Object, ListAdapter> { 
     protected ListAdapter doInBackground(Object... params) { 
      SQLiteCursor cursor = db.getSomeData(); 
      startManagingCursor(cursor); 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, ..., cursor, ..., ...); 
      return adapter; 
     } 

     protected void onPostExecute(ListAdapter result) { 
      listView.setAdapter(result); 
     } 
    } 
} 

이것은 RuntimeException을 발생 - 라인에서 "Looper.prepare라고하지 않은 스레드() 안에 핸들러를 만들 수 없습니다"를 SimpleCursorAdapter가 인스턴스화되는 경우 .

왜 이런 일이 벌어지고 있는지 이해합니다. 문제를 해결하는 방법을 모르겠습니다 (별도의 스레드에서 유지). 나는이 스레드를 발견 :

http://groups.google.com/group/android-developers/browse_thread/thread/34d0069bb2de925e?fwc=2

하지만 난 정말 응답을 이해하지 않습니다. 나는 과 같은 SQLiteCursor와 AsyncQueryHandler를 포함하는 구글에 실패했다.

도와 주시겠습니까? 감사.

답변

5

UI 스레드에서 SimpleCursorAdapter이 발생해야하는 것처럼 보입니다. doInBackground()cursor으로 보내고 어댑터를 onPostExecute()으로 설정하면됩니다.

Painless Threading을 아직 확인하지 않은 경우 참조하십시오.

+0

맞아. 그러나 커서가 수천 개의 레코드처럼 반환되면 UI 스레드를 차단하지 않을까요? – Jarek

+3

커서가 반환되면 초기 쿼리가 완료되고 어댑터에 많은 양의 레코드가 있어도 어댑터가 멈추지 않는다고 생각합니다. 이제 [Javadocs] (http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html)는 _requerying_ 때문에 API 레벨 11에서 'SimpleCursorAdapter' 생성자가 더 이상 사용되지 않음을 보여줍니다. 기본 콘텐츠가 변경 사항을 브로드 캐스팅 할 때 UI 스레드. 이전 API에 맞서 개발 중이라면 UI 스레드에 다시 쿼리하거나 사용자 자신의'ResourceCursorAdapter'를 굴려야하는 것처럼 보입니다. –

+0

API 레벨 7을 사용하고 있습니다. SimpleCursorAdapter가 실제로 어떻게 동작하는지 보려면 몇 가지 테스트를 수행해야합니다. 그러나 UI 스레드를 차단한다고 판단되는 경우에도 다른 옵션은 표시되지 않으므로 그대로 두어야합니다. 고마워, 로버트 – Jarek

0

그냥 Looper.prepare(); 이러한 오류를 throw하는 메서드의 맨 위에.