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 스레드에서 위젯을 채울 핸들러에 그들 모두를 통과하는 것입니다. 그러나 이것은 커서에 많은 값을 가질 수 있기 때문에 추한 것입니다. 나는이 모든 것을 처리 할 수있는 신뢰할 수있는 충돌없는 방법을 찾고 싶다.
"onLoadFinished 안에있는 모든 커서 필드를 직접 가져 와서 핸들러에 전달하여 UI 스레드에서 위젯을 채 웁니다."- onLoadFinished()는 메인 애플리케이션 스레드에서 호출됩니다. – CommonsWare
@CommonsWare 내가 아는 한, onLoadFinished는 기본 UI 스레드에서 호출되지 않습니다. Reto Meier가 작성한 android-protips_location 소스 코드에서 예제를 살펴보면 핸들러를 사용하여 위젯에 값을 채 웁니다. onLoadFinished() 위의 그의 의견은 그가 메인 애플리케이션 스레드에 대한 업데이트를 예약한다는 것입니다. –
Reto Meier의 말 : "onLoadFinished가 메인 애플리케이션 스레드와 동기화되지 않았으므로 Cursor가로드 된 것과 동일한 스레드에서 Cursor 값을 추출하고 새 Runnable을 UI 스레드에 게시하여 새 스레드를 할당합니다. 값을 UI 요소에 " –