통신을 통해 데이터를 스레드를 통해 딱… 가져오고 난 후 동일한 스레드에서 바로 Spinner 등과 같은 UI에 데이터를 설정하시면 우에엑~~ 하고 구토를 하시는 안드로이드님.
UI 단에 데이터를 설정할 수 있는 권한은 오직 UI 스레드, 즉 메인 스레드만이 하실 수 있는 전지전능하신 권한이므로 감히 자식 스레드에서는 기도를 통해 소원을 빌어야 합니다. 안드로이드님께서는 이러한 기도를 runOnUiThread라는 Context의 매서드를 통해 가능하게 하옵시고..
아래와 같은 예제를 통해 기도 방법을 메모하고자 합니다.
String strJSON = event.getResultJSON();
if(strJSON != null) {
if(event.getRequestId().compareTo("행정구") == 0) {
JSONArray array = (JSONArray)JSONValue.parse(strJSON);
Iterator iter = array.iterator();
final ArrayList list = new ArrayList();
while(iter.hasNext()) {
JSONObject obj = (JSONObject)iter.next();
Set keySet = obj.keySet();
Iterator keyIter = keySet.iterator();
while(keyIter.hasNext()) {
Object key = keyIter.next();
Object val = obj.get(key);
list.add(val);
}
}
Collections.sort(list);
this.runOnUiThread(
new Runnable() {
@Override
public void run() {
Spinner spGuName = (Spinner)findViewById(R.id.spGuName);
ArrayAdapter<Object> adapter = new ArrayAdapter<Object>(
ActivitySearchLocation.this,
R.layout.custom_simple_dropdown_item_1line, list.toArray()
);
spGuName.setAdapter(adapter);
}
});
}
}
위의 코드는 데이터를 가져오는 통신 스레드에서 실행되는 코드이고 23번째 줄이 바로 ‘기도’에 해당합니다. 정작 중요한 내용보다 부수적인 내용이 더 많은 코드이지만.. 나중을 위해 Keep 해 둡니다. 참고로 가져온 데이터를 배열로 저장하고 이를 Collections 클래스의 정적 함수인 sort를 통해 정렬하고 있습니다.
