zoukankan      html  css  js  c++  java
  • 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. }  
  • 相关阅读:
    Eagle+微力同步实现素材资源协同共享
    Eagle+欧奥PicHome创建私有的pinterest网站
    C# 从Json中获取byte[] 二进制数据
    Vivado SDK 2016.4改JTAG速度
    启动jmeter,提示:unable to access jarfile apacheJmeter.jar
    直播来啦!亮相微软平台,聊聊Dapr的落地应用
    互斥锁、自旋锁、读写锁...理清它们的区别和应用
    行云创新:云原生技术助力企业数字化转型
    行云创新亮相“OSCAR开源产业大会”:云调试加速应用创新
    Actor模型是如何让编写并发系统变得更简单的?
  • 原文地址:https://www.cnblogs.com/nimorl/p/5448869.html
Copyright © 2011-2022 走看看