본문 바로가기
개발/android

스레드에서 View 변경시 Only the original thread…. 에러 대처법

by 매몰 2013. 11. 25.

게임을 만들다 보면 스레드를 자주 이용하게 된다. 

그러다보면 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;

}

}

};








 

 매몰: 고영진


 1인 개발자 

     실패만 하고 있어도 꿈을 포기하지 않는 남자. 

     제가 직접 경험하고 습득한 지식을 위주로 올릴게요. 







사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기