2012-04-11 2 views
6

CursorLoader을 사용하여 화면에서 위젯을 채우는 방법을 알고 싶습니다. 모든 온라인 예제는 어댑터를 사용하는 경우에 적합합니다. 내가 원하는 건 내 화면에서 Cursor와 UI 스레드에서 뷰를 업데이트하고 때로는 StaleDataException이나 커서가 갑자기 비활성화되어 충돌을 일으키지 않는 안정적인 방법입니다. 다음은 현재 진행중인 접근 방식이지만 여전히 사용자로부터 일부 오류 보고서를 수신합니다.onLoadFinished()의 커서에서 위젯 채우기

@Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) { 
     CursorLoader loader = null; 

     switch (id) { 
      case LOADER_ID_DATA: 
       loader = new CursorLoader(...); 
       break; 
     } 

     return loader; 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, final Cursor cursor) { 
     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       if (getActivity() == null) 
        return; 

       updateView(cursor); 
      } 
     }); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> arg0) { 
    } 

하나의 해결책은 onLoadFinished 내에서 직접 모든 커서 필드를 검색하고 UI 스레드에서 위젯을 채울 핸들러에 그들 모두를 통과하는 것입니다. 그러나 이것은 커서에 많은 값을 가질 수 있기 때문에 추한 것입니다. 나는이 모든 것을 처리 할 수있는 신뢰할 수있는 충돌없는 방법을 찾고 싶다.

+0

"onLoadFinished 안에있는 모든 커서 필드를 직접 가져 와서 핸들러에 전달하여 UI 스레드에서 위젯을 채 웁니다."- onLoadFinished()는 메인 애플리케이션 스레드에서 호출됩니다. – CommonsWare

+0

@CommonsWare 내가 아는 한, onLoadFinished는 기본 UI 스레드에서 호출되지 않습니다. Reto Meier가 작성한 android-protips_location 소스 코드에서 예제를 살펴보면 핸들러를 사용하여 위젯에 값을 채 웁니다. onLoadFinished() 위의 그의 의견은 그가 메인 애플리케이션 스레드에 대한 업데이트를 예약한다는 것입니다. –

+0

Reto Meier의 말 : "onLoadFinished가 메인 애플리케이션 스레드와 동기화되지 않았으므로 Cursor가로드 된 것과 동일한 스레드에서 Cursor 값을 추출하고 새 Runnable을 UI 스레드에 게시하여 새 스레드를 할당합니다. 값을 UI 요소에 " –

답변

7

# android-dev SimonVTreadme에 대한 질문을 듣고 나면이 부분을 알 수있었습니다.

UI 스레드에서 onLoadFinished이 호출 될 것이므로 이론적으로 Retot의 책에서 설명한 것과 같이 Handler을 사용해야합니다. 그러나 CursorLoader (훨씬 일반적인 사용 사례)을 사용하면 onLoadFinished이 UI 스레드에서 호출된다는 것을 거의 보장 할 수 있습니다.

+3

"꽤 많이"사용하는 이유는 CursorLoader가 AsyncTask를 사용하여 배경 작업을 수행하고 정적 처리기를 사용하여 게시하고 궁극적으로 onLoadFinished를 호출하기 때문입니다. 주 스레드에서 LoaderManager.initLoader (...)를 호출하면 핸들러가 주 스레드에도 연결될 수 있습니다. 이 핸들러가 주 스레드에 연결되지 않도록하려면 루퍼로 스레드를 만들고 거기에서 로더를 시작해야합니다. – SimonVT

관련 문제