안드로이드 개발 질문/답변
(글 수 45,052)
ui 쓰레드에 뷰 객체들을 직접적으로 다른 쓰레드에서 컨트롤 하면 안되잔아요..
그런데 왜 프로그레스바는 잘돌아가나요? 헨들러 객체를 사용하지 않았는데 말이죠.
public void onCreate(Bundle savedInstanceState) {
.....
new Thread(new Runnable() {
public void run() {
barGo();
}
}).start();
public void barGo(){
while(progress<100){
progress =progress +5 ;
bar.setProgress(progress);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2010.08.27 16:22:11
ProgressBar를 Layout에 정의해 놓고 쓰시지 않나요?
쓰레드에서는 오직 progress값만 변화를 시키고 결국 Display하는건 Main이 아닐런지...
2010.08.27 16:43:36
ProgressBar는 처음에 onCreate() - setContentView(레이아웃); 에서 Diplay 되고
쓰레드에서는 Setting값만 변화시키지 Display에 영향을 주지 않는게 아닐까 해서요..
2010.08.27 16:59:07
main 쓰레드에서도 ProgressBa 객체 상태값을 가지고 화면에 그리는거 같은데 그러면 다른 쓰레드에서 ProgressBa 값을 바꾸면
Display에 영향을 주는게 아닌가요 ..?
2010.08.27 17:09:00
소스를 보시면 압니다.
private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
if (mUiThreadId == Thread.currentThread().getId()) {
doRefreshProgress(id, progress, fromUser);
} else {
RefreshProgressRunnable r;
if (mRefreshProgressRunnable != null) {
// Use cached RefreshProgressRunnable if available
r = mRefreshProgressRunnable;
// Uncache it
mRefreshProgressRunnable = null;
r.setup(id, progress, fromUser);
} else {
// Make a new one
r = new RefreshProgressRunnable(id, progress, fromUser);
}
post(r);
}
}
setProgress 햇을때 반드시 호출되는 함수입니다. private죠...
미루어 짐작하건데 setup을 통해서 runnable을 만들고 그것을 post 하는 방법으로 갱신 하는듯 보입니다.
이렇게 하면 스레드랑은 관계 없겠죠.
private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
if (mUiThreadId == Thread.currentThread().getId()) {
doRefreshProgress(id, progress, fromUser);
} else {
RefreshProgressRunnable r;
if (mRefreshProgressRunnable != null) {
// Use cached RefreshProgressRunnable if available
r = mRefreshProgressRunnable;
// Uncache it
mRefreshProgressRunnable = null;
r.setup(id, progress, fromUser);
} else {
// Make a new one
r = new RefreshProgressRunnable(id, progress, fromUser);
}
post(r);
}
}
setProgress 햇을때 반드시 호출되는 함수입니다. private죠...
미루어 짐작하건데 setup을 통해서 runnable을 만들고 그것을 post 하는 방법으로 갱신 하는듯 보입니다.
이렇게 하면 스레드랑은 관계 없겠죠.