andorid handlerメッセージングメカニズム


1つのプログラムが最初に起動されると、Androidは同時にメインスレッド(Main Thread)を起動し、メインスレッドは主にUIに関連するイベント、例えばユーザーのボタンイベント、ユーザーがスクリーンに接触するイベント、スクリーン描画イベントを処理し、関連するイベントを対応するコンポーネントに配布して処理する.したがって、メインスレッドはUIスレッドとも呼ばれる. 
パフォーマンスの最適化を考慮すると、AndroidのUI操作はスレッドセキュリティではありません.これは、複数のスレッドがUIコンポーネントを同時に操作している場合、スレッドセキュリティの問題を引き起こす可能性があることを意味します.この問題を解決するために、AndroidはUIスレッドのみがActivityのUIコンポーネントを変更することを許可し、新しいスレッドを起動してUIをリフレッシュしようとするのは許されないという簡単な原則を制定した.では、新しいスレッドがUIをリフレッシュできるようにするにはどうすればいいのでしょうか.この問題を解決するためにAndroidはHandlerを導入してこの問題を解決した.
Handlerクラスの主な役割は2つあります.
  • は、新たに開始するスレッドにおいてメッセージ
  • を送信する.
  • は、メインスレッドにおいてメッセージ
  • を取得、処理する.
    package com.qicaiz.handlertest;
    
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class MainActivity extends Activity
    {
    	TextView showTextView;
    	Button addButton;
    	MyHandler myHandler;
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		showTextView = (TextView)findViewById(R.id.showTextView);
    		addButton = (Button)findViewById(R.id.addButton);
    
                    //       myHandler,         handleMessage(Message msg)  
    		myHandler  = new MyHandler();
    		
    		addButton.setOnClickListener(new View.OnClickListener()
    		{
    			
    			@Override
    			public void onClick(View arg0)
    			{
    				// TODO Auto-generated method stu
    				MyThread myThread = new MyThread();
    				new Thread(myThread).start();
    			}
    		});
    	}
    	
            //       
    	class MyThread implements Runnable
    	{
    
    		@Override
    		public void run()
    		{
    			// TODO Auto-generated method stub
    			try
    			{
    				Thread.sleep(10000);
    			}
    			catch(InterruptedException e)
    			{
    				e.printStackTrace();
    			}
    			Message msg = new Message();
    			Bundle bundle = new Bundle();
    			bundle.putString("add", "  UI");
    			msg.setData(bundle);
    			myHandler.sendMessage(msg); //myHandler            
    			
    		}
    		
    	}
    	//  MyHandler   Handler   handleMessage(Message msg)  
    	class MyHandler extends Handler
    	{
    
                    //       
    		@Override
    		public void handleMessage(Message msg)
    		{
    			// TODO Auto-generated method stub
    			super.handleMessage(msg);
    			Bundle bundle = msg.getData();
    			String str  = bundle.getString("add");
                           //      ,  UI
                            showTextView.setText(str);
    		}
    		
    	}
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu)
    	{
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }