안드로이드 개발 질문/답변
(글 수 45,052)
ㅠㅠ 계속 질문만 하게되네요..
다름이 아니라...
어떤 타이머가 있어서 20초 간격으로 웹서버에서 데이타를 불러오고 (이걸 다른 스레드에서 작업)
데이타가 불러와지면 메인 스레드의 핸들러를 불러다가 이 핸들러 안에서 UI 컴포넌트 업데이트를 수행합니다.
예를들어 리스트의 내용을 불러온 데이타로 바꾼다던지..
제가 알기로 UI 컴포넌트를 수정하려면 그것은 다른 스레드에서 할수 없고 메인 스레드에서만 가능한걸로 알고있는데요
만일 메인 스레드에서 UI컴포넌트를 업데이트 할때 시간이 걸린다면 이 경우는 어떻게 해야하나요?
어떤 프로그램을 봤는데 거기서는 많은 양의 데이터를 UI로 업데이트 했는데도 화면이 버벅거리지 않고 빠르게 되던데..
다른 방법이 없는건가요.?
Not Responding 메세지창대문에 아주 죽겠심도.ㅠㅠ
다름이 아니라...
어떤 타이머가 있어서 20초 간격으로 웹서버에서 데이타를 불러오고 (이걸 다른 스레드에서 작업)
데이타가 불러와지면 메인 스레드의 핸들러를 불러다가 이 핸들러 안에서 UI 컴포넌트 업데이트를 수행합니다.
예를들어 리스트의 내용을 불러온 데이타로 바꾼다던지..
제가 알기로 UI 컴포넌트를 수정하려면 그것은 다른 스레드에서 할수 없고 메인 스레드에서만 가능한걸로 알고있는데요
만일 메인 스레드에서 UI컴포넌트를 업데이트 할때 시간이 걸린다면 이 경우는 어떻게 해야하나요?
어떤 프로그램을 봤는데 거기서는 많은 양의 데이터를 UI로 업데이트 했는데도 화면이 버벅거리지 않고 빠르게 되던데..
다른 방법이 없는건가요.?
Not Responding 메세지창대문에 아주 죽겠심도.ㅠㅠ
2009.09.30 10:00:10
저도 같은 문제로 아래 코드와 동일하게 적용하였더니 해결되었습니다.(웹서버로 부터 뉴스 긁어와서 화면에 뿌려주기)
메인 GUI 쓰레드에서 Background 로 동작하는 쓰레드를 만들어 놓고,
Network 쓰레드에서 메인 GUI 에 있는 Background 쓰레드를 호출하면 해결이 가능합니다.
private void mainProcessing()
{
// 시간이 많이 드는 작업을 자식 스레드로 옮긴다.
Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background");
thread.start();
}
// 백그라운드 처리 메서드를 실행하는 Runnable.
private Runnable doBackgroundThreadProcessing = new Runnable()
{
public void run()
{
backgroundThreadProcessing();
}
};
// 백그라운드에서 몇 가지 처리를 수행하는 메서드.
private void backgroundThreadProcessing()
{
Log.d("Thread Start", "Thread Start~!");
try
{
//+
// [...시간 소모적인 작업들...]
//-
handler.post(doUpdateGUI);
}
catch (Exception ex)
{
ex.toString();
}
}
// GUI 업데이트 메서드를 실행하는 Runnable.
public Runnable doUpdateGUI = new Runnable()
{
public void run()
{
updateGUI();
}
};
public void updateGUI()
{
// [...다이얼로그를 오픈하거나 GUI 요소를 수정할 수 있다...]
}
제 경우는 메인 GUI 가 있는 Activity 에서 위 코드 그대로 입력 후
mainProcessing() 만 호출하여 소켓 통신 동작 시켰더니, 큰 문제없이 동작하더군요.
주석 참고하시고 한번 해보세요.
출처: 리토 마이어의 빨간책에 있는 내용을 그대로~
2009.09.30 13:06:31
UI을 업데이트할 때 시간이 많이 걸린다?
좀 이해가 안되는 데요? 실제 시간이 많이 걸린다면 서버를 인지하거나 실제 데이타를 가져올 때 많이 걸리는 것이지
UI 자체만으로는 시간이 많이 소요 되지는 않을 듯 하네요
실제 UI에 변경된 데이타를 반영할 때 오래 걸린다면 그것은 너무 많은 데이타를 가져오는 것이고
사용자가 그 많은 데이타를 볼 필요가 있는 것인지? (Application 설계의 잘못)
제 경험상으로
위의 리토의 빨간책에서 Handler가 처리하는 Runnable한 부분 즉 updateGUI는 상대적으로 적게 걸림니다.
2009.09.30 14:20:01
아 윗 코드가 도움되었습니다. 커트님말대로 저도 이해하는데요...
데이타를 가져오는 부분은 따로 스레드를 써서 영향을 안주는데 희안하게 UI상의 ListView에 업데이트하고 리프레쉬할때 시간이 5초정도 걸리더라고요.. 저도 이유는 모르겠음... new Date().getSecond(); 까지 써서 재봤는데 데이타 가져오는데는 딱 2초 걸리는데 (허용범위) 이상하게 가져온 데이타를 UI에 업데이트할때 5초인가까지 걸리더라고요.. 그래서 그때 UI가 멎는 현상 발생...
그나저나 dualweird님 말씀대로 저거 썼는데 updateGUI()가 더 적게 걸리네요.. .메인스레드랑 같은 스레드인데도... 따로 이유가 있나요?
데이타를 가져오는 부분은 따로 스레드를 써서 영향을 안주는데 희안하게 UI상의 ListView에 업데이트하고 리프레쉬할때 시간이 5초정도 걸리더라고요.. 저도 이유는 모르겠음... new Date().getSecond(); 까지 써서 재봤는데 데이타 가져오는데는 딱 2초 걸리는데 (허용범위) 이상하게 가져온 데이타를 UI에 업데이트할때 5초인가까지 걸리더라고요.. 그래서 그때 UI가 멎는 현상 발생...
그나저나 dualweird님 말씀대로 저거 썼는데 updateGUI()가 더 적게 걸리네요.. .메인스레드랑 같은 스레드인데도... 따로 이유가 있나요?