Handler基本概念

Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。 Handler 常用方法:

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中, sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

 

Android三种实现定时器的方法 

方法一:Handler+Thread

 

  1. package com.xunfang.handerDemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.widget.TextView;  
  8.   
  9. /** 
  10.  * handler定时器 
  11.  *  
  12.  * @author Smalt 
  13.  *  
  14.  */  
  15. public class HanderDemoActivity extends Activity {  
  16.     TextView tvShow;  
  17.     private int i = 0;  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         tvShow = (TextView) findViewById(R.id.tv_show);  
  24.         new Thread(new ThreadShow()).start();  
  25.     }  
  26.   
  27.     // handler类接收数据  
  28.     Handler handler = new Handler() {  
  29.         public void handleMessage(Message msg) {  
  30.             if (msg.what == 1) {  
  31.                 tvShow.setText(Integer.toString(i++));  
  32.                 System.out.println("receive....");  
  33.             }  
  34.         };  
  35.     };  
  36.   
  37.     // 线程类  
  38.     class ThreadShow implements Runnable {  
  39.   
  40.         @Override  
  41.         public void run() {  
  42.             // TODO Auto-generated method stub  
  43.             while (true) {  
  44.                 try {  
  45.                     Thread.sleep(1000);  
  46.                     Message msg = new Message();  
  47.                     msg.what = 1;  
  48.                     handler.sendMessage(msg);  
  49.                     System.out.println("send...");  
  50.                 } catch (Exception e) {  
  51.                     // TODO Auto-generated catch block  
  52.                     e.printStackTrace();  
  53.                     System.out.println("thread error...");  
  54.                 }  
  55.             }  
  56.         }  
  57.     }  
  58. }  
package com.xunfang.handerDemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

/**
 * handler定时器
 * 
 * @author Smalt
 * 
 */
public class HanderDemoActivity extends Activity {
	TextView tvShow;
	private int i = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tvShow = (TextView) findViewById(R.id.tv_show);
		new Thread(new ThreadShow()).start();
	}

	// handler类接收数据
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == 1) {
				tvShow.setText(Integer.toString(i++));
				System.out.println("receive....");
			}
		};
	};

	// 线程类
	class ThreadShow implements Runnable {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				try {
					Thread.sleep(1000);
					Message msg = new Message();
					msg.what = 1;
					handler.sendMessage(msg);
					System.out.println("send...");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println("thread error...");
				}
			}
		}
	}
}


方法二:Handler类自带的postDelyed

 

 

  1. package com.xunfang.handerDemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.widget.TextView;  
  7.   
  8. /** 
  9.  * handler定时器使用postDelyed实现 
  10.  *  
  11.  * @author Smalt 
  12.  *  
  13.  */  
  14. public class HanderDemoActivity extends Activity {  
  15.     TextView tvShow;  
  16.     private int i = 0;  
  17.     private int TIME = 1000;  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.         tvShow = (TextView) findViewById(R.id.tv_show);  
  24.         handler.postDelayed(runnable, TIME); //每隔1s执行  
  25.     }  
  26.   
  27.     Handler handler = new Handler();  
  28.     Runnable runnable = new Runnable() {  
  29.   
  30.         @Override  
  31.         public void run() {  
  32.             // handler自带方法实现定时器  
  33.             try {  
  34.                 handler.postDelayed(this, TIME);  
  35.                 tvShow.setText(Integer.toString(i++));  
  36.                 System.out.println("do...");  
  37.             } catch (Exception e) {  
  38.                 // TODO Auto-generated catch block  
  39.                 e.printStackTrace();  
  40.                 System.out.println("exception...");  
  41.             }  
  42.         }  
  43.     };  
  44.   
  45. }  
package com.xunfang.handerDemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

/**
 * handler定时器使用postDelyed实现
 * 
 * @author Smalt
 * 
 */
public class HanderDemoActivity extends Activity {
	TextView tvShow;
	private int i = 0;
	private int TIME = 1000;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tvShow = (TextView) findViewById(R.id.tv_show);
		handler.postDelayed(runnable, TIME); //每隔1s执行
	}

	Handler handler = new Handler();
	Runnable runnable = new Runnable() {

		@Override
		public void run() {
			// handler自带方法实现定时器
			try {
				handler.postDelayed(this, TIME);
				tvShow.setText(Integer.toString(i++));
				System.out.println("do...");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("exception...");
			}
		}
	};

}


方法三:

 

Handler+Timer+TimerTask

 

    1. package com.xunfang.handerDemo;  
    2.   
    3. import java.util.Timer;  
    4. import java.util.TimerTask;  
    5.   
    6. import android.app.Activity;  
    7. import android.os.Bundle;  
    8. import android.os.Handler;  
    9. import android.os.Message;  
    10. import android.widget.TextView;  
    11.   
    12. /** 
    13.  * 定时器实现:Handler+Timer+TimerTask 
    14.  *  
    15.  * @author Smalt 
    16.  *  
    17.  */  
    18. public class HanderDemoActivity extends Activity {  
    19.     TextView tvShow;  
    20.     private int i = 0;  
    21.     private int TIME = 1000;  
    22.   
    23.     @Override  
    24.     public void onCreate(Bundle savedInstanceState) {  
    25.         super.onCreate(savedInstanceState);  
    26.         setContentView(R.layout.main);  
    27.         tvShow = (TextView) findViewById(R.id.tv_show);  
    28.         timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
    29.     }  
    30.   
    31.     Handler handler = new Handler() {  
    32.         public void handleMessage(Message msg) {  
    33.             if (msg.what == 1) {  
    34.                 tvShow.setText(Integer.toString(i++));  
    35.             }  
    36.             super.handleMessage(msg);  
    37.         };  
    38.     };  
    39.     Timer timer = new Timer();  
    40.     TimerTask task = new TimerTask() {  
    41.   
    42.         @Override  
    43.         public void run() {  
    44.             // 需要做的事:发送消息  
    45.             Message message = new Message();  
    46.             message.what = 1;  
    47.             handler.sendMessage(message);  
    48.         }  
    49.     };  
    50. }  
posted @ 2016-04-30 16:02  风雪江山  阅读(345)  评论(0编辑  收藏  举报