android 학습의--Handler 메시지 전달 메커니즘

안드로이드의 메시지 전달 메커니즘은 또 다른 형식의'사건 처리'이다. 이런 메커니즘은 주로 안드로이드 응용의 다중 루틴 문제를 해결하기 위한 것이다. 안드로이드 플랫폼은 UI 루틴이Activity의 구성 요소만 수정할 수 있도록 허용하기 때문에 새로 시작한 루틴은 인터페이스 구성 요소의 속성 값을 동적으로 바꿀 수 없다.그러나 실제 개발에서 새로운 라인이 인터페이스 구성 요소의 속성 값을 바꿀 수 있도록 해야 하기 때문에handler의 메시지 전달 메커니즘을 빌려 실현해야 한다.
Handler 클래스 소개:
Handler 클래스의 주요 역할:
  • 새로 시작하는 라인에서 메시지 보내기
  • 주 스레드에서 메시지 얻기, 처리
  • 리셋 방법 -Handler 클래스에서 메시지를 처리하는 방법을 다시 써서 주 라인이 i가 새로 시작한 라인에서 보낸 메시지를 적시에 출력할 수 있도록 합니다.새로 시작한 루틴이 메시지를 보낼 때, 메시지는 그와 관련된 MessageQueue에 전송되고,Handler는 끊임없이 MessageQueue에서 메시지를 가져오고 처리합니다. 이것은Handler류에서 메시지를 처리하는 방법을 되돌려줍니다.
    Handler 클래스에는 메시지를 전송하고 처리하는 다음과 같은 방법이 있습니다.
  • void handle Message(Message msg): 메시지를 처리하는 방법.보통 다시 쓴다.
  • final boolean has Messages (int what): 메시지 대기열에 what 속성이 지정한 값인 메시지가 포함되어 있는지 확인합니다.
  • final boolean hasMessages(int what, Object object): 메시지 대기열에 what 속성이 지정된 값이고 object 속성이 지정된 대상인 메시지가 포함되어 있는지 확인합니다.
  • 다중 다시 로드된 메시지 obtain 메시지 (): 메시지를 받습니다.
  • sendEmptyMessage(int what): 빈 메시지를 보냅니다.
  • final boolean sendEmptyMessage Delayed(int what, long delay Millis): 몇 밀리초를 지정하여 빈 메시지를 보냅니다.
  • final boolean sendMessage(Message msg): 즉시 메시지를 보냅니다.
  • final boolean sendMessage Delayed(Message msg, long delay Millis): 메시지를 보낼 밀리초를 지정합니다.
  •                       ImageView      。
    public class MainActivity extends Activity {
    	
    	//           ID
    	int[] imagesId = new int[]{
    		R.drawable.a,
    		R.drawable.b,
    		R.drawable.c,
    		R.drawable.d,
    		R.drawable.e
    	};
    	int currentImageId = 0;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		final ImageView show = (ImageView) findViewById(R.id.show);
    		
    		final Handler mHandler = new Handler(){
    
    			@Override
    			public void handleMessage(Message msg) {
    				// TODO Auto-generated method stub
    				//              
    				if(msg.what == 0x123){
    					//           ID
    					show.setImageResource(imagesId[currentImageId++]);
    					if(currentImageId>4){
    						currentImageId = 0;
    					}
    				}
    			}
    			
    		};
    		//       ,               
    		new Timer().schedule(new TimerTask() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				//          Activity    
    				//    Handler    
    				Message msg = new Message();
    				msg.what = 0x123;
    				
    				//    
    				mHandler.sendMessage(msg);
    			}
    		}, 0, 800);
    	}
    }
    새 스레드가 메시지를 보낼 때handler의handle Message(Message msg) 방법은Activity에서 구성 요소의 속성을 바꾸기 위해 자동으로 리셋됩니다.
    Handler와 함께 작동하는 여러 구성 요소(Handler의 작동 원리를 더 잘 이해하기 위해):
  • Handler: 루퍼가 관리하는 MessageQueue에 메시지를 보내고 루퍼가 나눠준 메시지를 처리합니다.
  • Message:Handler가 수신하고 처리한 메시지 대상.
  • Looper: 스레드당 하나의 Looper만 사용할 수 있습니다.그것의 loop 방법은MessageQueue의 정보를 읽고 해당하는Handler에 메시지를 나누어 처리하는 것을 책임진다.
  • MessageQueue: 메시지 대기열, 선진적인 선출 방식으로 Message를 관리하고 프로그램이 Looper 대상을 만들 때 구조기에서 MessageQueue 대상을 만듭니다.소스:
  • private Looper(){
    	mQueue = new MessageQueue();
    	mRn = true;
    	mThread = Thread.currentThread();
    }
    원본 코드를 통해 알 수 있듯이 구조기를 통해 Looper 대상을 만들 수 없습니다. 프로그램은 Looper를 초기화할 때 이와 관련된 MessageQueue를 만들 것입니다. 이 MessageQueue는 메시지를 관리합니다.
    Handler가 올바르게 작동하려면 현재 스레드에 Looper 객체가 있어야 합니다.
  • 메인 UI 스레드에서 시스템이 Looper 대상을 초기화하였기 때문에 프로그램은Handler를 직접 만들면Handler를 통해 메시지를 보내고 처리할 수 있습니다.
  • 저희가 직접 시작한 서브루틴은 Looper 대상을 만들고 시작해야 합니다.Looper 대상을 만들고 prepare () 방법을 사용하면 됩니다. (prepare () 방법은 모든 라인에 최대 하나의 Looper 대상만 있음을 보장합니다.) 그리고 Looper 정적 loop () 방법을 호출해서 그것을 시작합니다. (loop () 는 사순환을 사용하고, MessageQueue에서 끊임없이 이자를 제거하여 대응하는Handler 처리에 전달합니다.)

  • 스레드에서 Handler를 사용하려면
  • Looper의prepare () 방법을 호출하여 Looper 대상을 만들고 그와 일치하는 MessageQueue가 생성됩니다
  • handler 하위 클래스 실례를 만들고handlerMessage () 방법을 다시 쓰며 다른 루트에서 온 정보를 처리합니다.
  • Looper의 loop() 방법을 호출하여 Looper를 시작합니다.

  • 예: 새로운 라인을 이용하여 질수를 계산하다
    public class MainActivity extends Activity {
    	
    	//2~UPPER_NUM      
    	static final String UPPER_NUM = "upper";
    	EditText etNum;
    	
    	//             
    	CalThread calThread;
    	class CalThread extends Thread{
    		public Handler handler;
    		public void run(){
    			//Looper prepare      Looper  ,         MessageQueue
    			Looper.prepare();
    			handler = new Handler(){
    				//         
    				@Override
    				public void handleMessage(Message msg) {
    					// TODO Auto-generated method stub
    					if(msg.what==0x123){
    						//   2 upper   
    						int upper = msg.getData().getInt(UPPER_NUM);
    						List nums = new ArrayList();
    						outer:
    							for(int i = 2;i
    이 프로그램을 실행하면 입력한 데이터에 따라 이 범위 내의 질량을 계산하여 새로운 라인에 맡기고 프런트 UI는 영향을 받지 않는다.

    좋은 웹페이지 즐겨찾기