안드로이드 개발 질문/답변
(글 수 45,052)
제가 버튼을 눌렀을 때 데이터 처리를 하여 리스트에 보이려는 것을 구현하였습니다.
버튼을 누르면 데이터 처리하는 시간이 걸리기 때문에 데이터 처리하는 부분을 스레드로 구현하였으며,
데이터를 처리하는 동안 프로그레스다이어로그(원형)를 띄어었습니다.
소스코드를 보면
public class MyListView extends ListActivity implements Runnable{
public void run(){
...
//여기서 에러
MyListView.this.setListAdapter(new ArrayAdapter(MyListView.this,android.R.layout.simple_list_item_1,artists));
}
myAlphabetBtn.R.setOnClickListener(new OnClickListener() { // 버튼 클릭했을때
@Override
public void onClick(View v) {
//프로그레스 대화상자를 띄움
ProgressDialog.show(this, "", "Loading, Please wait....");
ProgressDialog dlg = ProgressDialog.show(this, "", "Loading, Please wait...", true);
Thread thd = new Thread(this);
thd.start():
//스레드가 끝나면 프로그레스 다이어로그 없애는 코드 삽입
}}
대략 이렇게됩니다.
위의 방식대로 하면 run()함수에서
MyListView.this.setListAdapter(new ArrayAdapter(MyListView.this,android.R.layout.simple_list_item_1,artists));
이 에러가 나면서 프로그램은 종료됩니다.
왜 이부분에서 에러가 날까요??
이 코드를 없애면 스레드는 잘 돌아갑니다. 이 코드랑 스레드와 어떤 연관이 있을까요?
고수님들 꼭 답변부탁드립니다.
2010.10.22 17:27:35
생성한 쓰레드에서 메인UI 쓰레드를 건드리기 때문에 발생하는 오류로 보여지는데요 . handler를 만들어서 Post로 쏘는 방법이 가장 일반적이고요. . 더 손쉬운 방법은 구글에서 runOnUiThread(런어블객체)라는 메소드를 제공하는데요 위에 코드에서는 run()안에 써주시면 될것 같네요, 더 자세한 설명은 구글링으로 ~~ 그리고, 저도 리스트뷰 처음 쓸때 했던 실수인데여 , SetAdapter는 가능하면 초기화할때만 해주시고 그 다음부터는 notifyDataSetChanged 으로 상태변화만 체크하시는게 좋습니다
UI갱신은 오직 UI스레드에서만 되는 안드로이드의 룰땜시 그렇습니다.
만약 저걸 처리하실라믄 handler.post를 활용해보세요.