2012. 7. 30. 20:39

Thread 에서 소켓 통신을 하고, 그 값을 받아 올때마다  UI를 변경 시켜 주고싶을때, MainActivity를 그대로 넘겨버릴 수도 있지만, 그렇게 되는 경우 Activity의 전환시 그 통신을 계속 할수가 없다. 


Thread 를 다시 생성하여 그 Activity를 넘겨줘야 하기 때문이다. 

이런경우 우리는 singletone pattern 과 Handler를 이용하여 완벽히 해결 할 수 있다. 


우선 Handler 란? 

Thread 에서 UI 같은 Main Thread 의 값을 변경해 주기 위해서 MainThread 의 역할을 잠깐 위임해 주는 것이다.

C#에서는 delegate가 비슷한 역할을 한다. 


사용법은 아래의 출처 예제코드가 가장 간단하고 이해하기 편하다.

http://www.cyworld.com/aspire1127/5581351


사용을 예로들면 

우선 MainActivity 에 Handler 클래스를 선언해 준다.

Override 를 통해 HandlerMessage를 재정의해준다. 


MainAcitivity 의 위 선언부

  public Handler hMain = new Handler() {

@Override

public void handleMessage(Message msg) {

IntentMainToGame(); //MainActivity의 함수이다.

}

};


MainAcitivity->IntentMainToGame()

  public void IntentMainToGame() {

 Toast toast = Toast.makeText(getBaseContext(),"회원가입 완료",Toast.LENGTH_SHORT);

 toast.setGravity(Gravity.CENTER,0, 0);

 toast.show();

Log.e("-------------------------", "thread");

Intent intent = new Intent(MainActivity.this,GameActivity.class);

 startActivity(intent);

}



그리고 MainActivity에서 Thread 를 생성시에 이 핸들러를 넘겨준다.

MainAcitivity 내 thread 호출시..

  mScoketClient.startServer(hMain);




Thread 안에 Thread 시에도 이 핸들러 값만 이어서 가져가 주면된다.

private Handler mHandle=null;
       public void startServer(Handler _handle) {
this.mHandle = _handle;
}



이후에 이 핸들러의 sendMessage를 통하여 인자값을 전하고 원하는 메소드를 호출 시킬수 있다.
Thread 안 메시지 로 sendMessage 호출

 Message msg = Message.obtain(mHandle,0,0);
mHandle.sendMessage(msg);




Posted by k1rha