마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커서의 데이터들을 스레드로 업데이트 해주고자 할때

0 추천

Cursor의 데이터들을 ListView와 Adapter를 통해서 일렬로 보여주는 것이 아닌, 리니어 또는 상대성레이아웃으로 하나의 레이아웃안에 텍스트뷰와 이미지뷰를 넣어 일정시간마다업데이트 해주는 방식으로 코딩 예제를 구현하고 있습니다.

제가 현재 구성한 방식은

public class getList(){

            Uri people = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

            String projection[] = new String[]{
                    ContactsContract.CommonDataKinds.Phone._ID,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
                    .
                    .
                    .
                     // 주소록을 얻어오는 소스와 동일
                     // TextView 및 ImageView를 통해 한 레이아웃안에 한개의 데이터만 표시할 수 있도록 구현됨.

                    Cursor.moveToNext();
}

커서가 처음 위치로 갈때 moveToFirst()구문은 가독성을 위해 여기엔 생략했습니다.

이것을 스레드에 전달하여 핸들러와 러너블 객체로 UI(TextView, ImageView 등)을 업데이트 하려고하니 첫번째 데이터는 정상적으로 표시되나 다음 데이터들은 표시되지 않았습니다. Cursor가 moveToNext()되면서, 스레드에서 정해진 지연시간마다 업데이트를 해주려니 했는데 그게 아니였네요...

(스레드 문제는 아닌것이 스레드에 프로그래스바를 동시에 구현해주면 정상적으로 동작하는걸 확인할 수 있었습니다)

moveToNext()와 무언가를 같이 사용해야 할것같은데... 도통 감이 오질 않습니다.
 

 

ps. acitivty_main.xml // 현재 커서에 담긴 데이터를 보여주는 레이아웃.

    <LinearLayout
        android:id="@+id/linear01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp" >

        <ImageView
            android:id="@+id/image01"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_marginRight="16dp" />

            <TextView
                android:id="@+id/textName01"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/number01"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"  />
 
        </LinearLayout>

CEL (1,140 포인트) 님이 2015년 5월 28일 질문
CEL님이 2015년 5월 28일 수정

1개의 답변

+1 추천
 
채택된 답변
CursorLoader를 쓰시고 화면 업데이트는 메인스레드에서 하세요.
익명사용자 님이 2015년 5월 28일 답변
CEL님이 2015년 5월 30일 채택됨
CursorLoader가 비동기 데이터 로딩을 지원한다는 점을 보아서  AsyncTask를 사용하면 되지 않을까 싶어 Async로 구현하여 성공했습니다. 데이터를 초기화해주고 Background에서 처리를 해주니 자연스럽게 업데이트가 됬습니다.

CursorLoader에서 큰 힌트를 얻은셈이네요...

감사합니다!
...