2011. 4. 21. 16:07 안드로이드

메세지 헨들러는 메세지 큐다
런에서 들어오는 값을 메세지 큐에다가 넣어둔다
그걸 가지고 메세지 헨들러에서는
자기가 속한 클레스의 값을 메세지 받은 것을 참고하여 값을 변경시켜준다


단방향 메세지 헨들러
public class MainActivity extends Activity{
.
.
.
.
Handler handler = new Handler() {

  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   switch (msg.what) {
   case 0:

    //tv2.setText(threadCnt + "");

    // Data를 Message에 실어 보내기
     tv2.setText(msg.arg1+"");
    break;

   default:
    break;
   }
  }

 };
}

 class MyRunnable implements Runnable {

  @Override
  public void run() {
   // TODO Auto-generated method stub
   while (true) {
    try {
     threadCnt++;

     //tv2.setText(threadCnt + "");
     // Handler
     //handler.sendEmptyMessage(0);

     // handler Message에 데이타 실어 보네기
      Message msg = Message.obtain();//메세지 얻어온다 메세지 풀로 부터 얻어온다 한번 쓰고 버릴려고한다
      msg.arg1 = threadCnt;
      msg.what = 0;
      handler.sendMessage(msg);

     Thread.sleep(1000);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }

  }
 }

양방향 메세지 헨들러

MainActivity 에서도 핸들러 mainHandler 를 가지고있고
MyThread 에서도 핸들러 threadHandler 를 가지고있따

MyThread에서는 mainHandler를 통해 MainActivity의 값을 변경시키고
MainActivity에서는 threadHandler를 통해 MyThread의 값을 변경시킨다


public class MainActivity extends Activity {

 .
.
.
.
 /** Called when the activity is first created. */

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

    findViewById(R.id.btnSquare).setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    Message msg = Message.obtain();
    msg.what = 0;
    msg.arg1 = Integer.parseInt(et.getText().toString());
    myTh.threadHandler.sendMessage(msg);

   }
  });

  findViewById(R.id.btnRoot).setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    Message msg = Message.obtain();
    msg.what = 1;
    msg.arg1 = Integer.parseInt(et.getText().toString());
    myTh.threadHandler.sendMessage(msg);
   }
  });

  myTh = new MyThread(mainHandler);
  myTh.setDaemon(true);
  myTh.start();
 }

 Handler mainHandler = new Handler() {

  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   //super.handleMessage(msg);
   System.out.println(msg.what);
   switch (msg.what) {
   case 0:
    tvResult.setText(msg.arg1 + "");
    break;
   case 1:
    
    System.out.println(((Double) msg.obj).doubleValue());
    tvResult.setText( "" + ((Double) msg.obj).doubleValue());
    break;
   default:
    break;
   }
  }
 };

}

class MyThread extends Thread {
 Handler mainHandler;

 public MyThread(Handler mainHandler) {
  this.mainHandler = mainHandler;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  Looper.prepare();
  Looper.loop();
 }

 public Handler threadHandler = new Handler() {

  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   Message returnMsg = Message.obtain();
   switch (msg.what) {
   case 0:
    try { Thread.sleep(100); } catch (InterruptedException e) {;}
    returnMsg.what = 0;
    returnMsg.arg1 = (msg.arg1 * msg.arg1);
    break;
   case 1:
    try { Thread.sleep(100); } catch (InterruptedException e) {;}
    returnMsg.what = 1;
    returnMsg.obj = new Double(Math.sqrt((double)msg.arg1));
    break;
   default:
    break;
   }
   mainHandler.sendMessage(returnMsg);
  }
 };
}

'안드로이드' 카테고리의 다른 글

안드로이드 assets파일 읽을때 file not found 에러  (0) 2011.05.20
android api demo 내용  (0) 2011.05.20
Alert 다이얼로그  (0) 2011.04.21
Intent  (0) 2011.04.21
안드로이드 shake 입력 결과 받기 체크  (0) 2011.03.17
posted by 욱이다