게임을 만들다 보면 스레드를 자주 이용하게 된다.
그러다보면 Only the original thread that created a view hierarchy can touch its views 라는 에러를 맞다들이게 되는 경우가 반드시 찾아온다...
이 에러는 말그래로 오리지널 스레드... 즉, 앱 실행시 자동으로 생성되는 메인 스레드외에 직접 만든 스레드로 뷰위젯등을 컨트롤할려고 할때 발생한다... 예를 들어 TextView의 setText()같은 것이다...
나도 처음 게임을 만들 당시 이것 때문에 몇일을 고민했던 적이 있었다... 그러다 찾아낸것이 View의 Post()였는데 이방법은 특정사항에서는 작동이 안되는 문제가 있었다...
결국, 우연한 기회에 Handler 방식을 알게되었는데 역시 다른 개발자분들은 널리 사용하고 계셨다 ㅎㅎ 아~ 또 나만 삽질끝에 알아낸것이다ㅎㅎ
어잿든 아래와 같이 나름 ActionHandler로 정리해서 유용하게 사용하고 있다
private static final String ACTION_KEY_TYPE = "ActionKeyType";
private static final String ACTION_KEY_VALUE = "ActionKeyValue";
private static final int ACTION_TYPE_SETTEXT = 0;
private static final int ACTION_TYPE_SETSCROLL = 1;
//스레드 영역에서 호출 예
private void testAction() {
sendActionMsg(ACTION_TYPE_SETTEXT, "테스트");
sendActionMsg(ACTION_TYPE_SETSCROLL, 10);
}
//핸들러 호출 함수
private void sendActionMsg(int action, String value) {
Message msg = mActionHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt(ACTION_KEY_TYPE, action);
bundle.putString(ACTION_KEY_VALUE, value);
msg.setData(bundle);
mActionHandler.sendMessage(msg);
}
private void sendActionMsg(int action, int value) {
Message msg = mActionHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt(ACTION_KEY_TYPE, action);
bundle.putInt(ACTION_KEY_VALUE, value);
msg.setData(bundle);
mActionHandler.sendMessage(msg);
}
//핸들러
public Handler mActionHandler = new Handler() {
public void handleMessage(Message msg) {
Bundle data = msg.getData();
switch(data.getInt(ACTION_KEY_TYPE)) {
case ACTION_TYPE_SETTEXT:
String strvalue = data.getString(ACTION_KEY_VALUE);
mTextView.setText(strvalue);
break;
case ACTION_TYPE_SETSCROLL:
int intvalue = data.getInt(ACTION_KEY_VALUE);
mLayout.scrollTo(0, intvalue);
break;
}
}
};
'개발 > android' 카테고리의 다른 글
안드로이드 앱 런칭후 데이터베이스 변경시 주의할점 (2) | 2014.01.20 |
---|---|
페이스북 안드로이드 sdk로 담벼락 글쓰기... 정리 2가지 (1) | 2014.01.09 |
배경 Layout을 손가락 터치로 따라 움직이게 하는 방법 (0) | 2013.10.08 |
큰 배경이미지 사용시 OutOfMemoryError의 확실한 해결법 (12) | 2013.10.04 |
단말기 해상도에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때 (0) | 2013.08.29 |