통신을 통해 데이터를 스레드를 통해 딱… 가져오고 난 후 동일한 스레드에서 바로 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를 통해 정렬하고 있습니다.