Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android入門之Handle

Android入門之Handle

編輯:關於Android編程

出於性能優化考慮,Android的UI操作並不是線程安全的,這意味著如果有多個線程並發操作UI組件,可能導致線程安全問題。為了解決這個問題,Android制定了一條簡單的規則:只允許UI線程修改Activity裡的UI組件。 Handle類的主要作用: - 在新啟動的線程中發送信息; - 在主線程中獲取、處理信息。

handle的兩個重要方法:

void handleMessage(Message msg):處理消息的方法

sendEmptyMessage(int what):發送空信息。what表示默認的信息代碼,用來區分信息的唯一性。


final Handler myHandler = new Handler ()
{
                   @Override
                   public void handleMessage(Message msg)
                   {
                         if (msg.what == 0x1222)
                         {
                            
                         }
                   }
 };
------------------------------------------------------------------------------------------------
在開發中我們有時會有這樣的需求,即在固定的每隔一段時間執行某一個任務。比如UI上的控件需要隨著時間改變,我們可以使用Java為我們提供的計時器的工具類,即Timer和TimerTask。

Timer是一個普通的類,其中有幾個重要的方法;而TimerTask則是一個抽象類,其中有一個抽象方法run(),類似線程中的run()方法,我們使用Timer創建一個他的對象,然後使用這對象的schedule方法來完成這種間隔的操作。

schedule方法有三個參數
第一個參數就是TimerTask類型的對象,我們實現TimerTask的run()方法就是要周期執行的一個任務;
第二個參數有兩種類型,第一種是long類型,表示多長時間後開始執行,另一種是Date類型,表示從那個時間後開始執行;
第三個參數就是執行的周期,為long類型。

schedule方法還有一種兩個參數的執行重載,第一個參數仍然是TimerTask,第二個表示為long的形式表示多長時間後執行一次,為Date就表示某個時間後執行一次。


Timer就是一個線程,使用schedule方法完成對TimerTask的調度,多個TimerTask可以共用一個Timer,也就是說Timer對象調用一次schedule方法就是創建了一個線程,並且調用一次schedule 後TimerTask是無限制的循環下去的,使用Timer的cancel()停止操作。當然同一個Timer執行一次cancel()方法後,所有Timer線程都被終止。
new Timer().schedule(
          new TimerTask(){ //TimerTask類型的對象,TimerTask的run()方法是要周期執行的一個任務
                  @Override
                  public void run()  {
                        currentColor ++;
                        if (currentColor >= 6)
                                currentColor = 0;                      
                        Message m = new Message();
                        m. what = 0x1122;
                        handler.sendMessage(m); 
                  }           
      },
      0 , //表示多長時間後開始執行
     100//執行的周期
); 
【example】 霓虹燈:
public class FrameLayoutTest extends Activity
{
	private int currentColor = 0;
	final int[] colors = new int[]
	{
		R.color.color7,
		R.color.color6,
		R.color.color5,
		R.color.color4,	
		R.color.color3,
		R.color.color2,
		R.color.color1,	
	};
	final int[] names = new int[]
	{
		R.id.View01,
		R.id.View02,
		R.id.View03,
		R.id.View04,
		R.id.View05,
		R.id.View06,
		R.id.View07
	};
	TextView[] views = new TextView[7];
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);	
		for (int i = 0 ; i < 7 ; i++)
		{
			views[i] = (TextView)findViewById(names[i]);
		}
		final Handler handler = new Handler()
		{
			@Override
			public void handleMessage(Message msg)
			{
				if(msg.what == 0x1122)
				{
					for(int i = 0 ; i < 7 - currentColor ; i++)	
					{
						views[i].setBackgroundResource(colors[i + currentColor]);
					}
					for(int i = 7 - currentColor , j = 0 ; i < 7 ; i++ ,j++)
					{
						views[i].setBackgroundResource(colors[j]);
					}
				}
			}
		};
		new Timer().schedule(new TimerTask()
		{
			@Override
			public void run()
			{
				currentColor++;
				if(currentColor >= 6)
				{
					currentColor = 0;
				}
				Message m = new Message();
				m.what = 0x1122;
				handler.sendMessage(m);	
			}		
		}, 0 , 100); 
	}
}

自動播放動畫:
public class HandlerTest extends Activity
{
	int[] imageIds = new int[]
	{ 
		R.drawable.haed_danya,
		R.drawable.haed_fanse,
		R.drawable.haed_fugu,
		R.drawable.haed_gudian,
		R.drawable.haed_houqingchu		
	};
	int currentImageId = 0;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		final ImageView show = (ImageView)findViewById(R.id.show);		
		final Handler myHandler = new Handler()
		{
			@Override
			public void handleMessage(Message msg)
			{
				if (msg.what == 0x1222)
				{
					show.setImageResource(imageIds[currentImageId++]);
					if (currentImageId >= 4)
					{
						currentImageId = 0; 
					}
				}
			}
		};

		new Timer().schedule(new TimerTask()
		{
			@Override
			public void run()
			{
				Message msg = new Message();
				msg.what = 0x1222;
				myHandler.sendMessage(msg);
			}
		}, 0 , 100);
	}
}





  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved