关闭

Timer+timertask+handler

108人阅读 评论(0) 收藏 举报

  handler的使用 
一、Handler的定义:

          主要接受子线程发送的数据, 并用此数据配合主线程更新UI.

          解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 
          比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。  如果此时需要一个耗时的操作,
          例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,
          界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到Android系统的一个错误提示  "强制关闭".  这个时候我们需要把
          这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,,Android主线程是线程不安全的,也就是说,更新UI只能在
          主线程中更新,子线程中操作是危险的. 这个时候,Handler就出现了.,来解决这个复杂的问题 ,    由于Handler运行在主线
          程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用
    sendMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

二、Handler一些特点

        handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
        它有两个作用: (1):  安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行
      
        Handler中分发消息的一些方法
        post(Runnable)
        postAtTime(Runnable,long)
        postDelayed(Runnable long)
        sendEmptyMessage(int)
        sendMessage(Message)
        sendMessageAtTime(Message,long)
        sendMessageDelayed(Message,long)

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

三、Handler实例

      (1) 子类需要继承Handler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据

      以下为一个实例,它实现的功能为 : 通过线程修改界面Button的内容 
     

 

实例一:

  有时候需要定时不停的更新Android UI 的界面,一般采用定时器的方式更新界面。在特定情况下销毁定时器。

Java代码  收藏代码
  1. package com.timer;  
  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.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. /** 
  14.  *  
  15.  *  
  16.  *android中使用 定时更新界面的方法 
  17.  *  
  18.  *  
  19.  */  
  20. public class TimerThreadActivity extends Activity implements OnClickListener {  
  21.   
  22.     /** Called when the activity is first created. */  
  23.   
  24.     public Button mTest;  
  25.     private int count = 1;  
  26.     /** 
  27.      * 消息处理器的应用 
  28.      */  
  29.     public Handler mHandler = new Handler() {  
  30.         @Override  
  31.         public void handleMessage(Message msg) {  
  32.             switch (msg.what) {  
  33.             case 1:  
  34.                 mTest.setText("count" + count);  
  35.                 System.out.println("Handler --> ID IS "  
  36.                         + Thread.currentThread().getId());// Handler处于UI线程中,更新界面的操作在此处执行  
  37.                 break;  
  38.             case 2:  
  39.                 mTimer.cancel();//  
  40.                 mTimer=null;  
  41.             }  
  42.             super.handleMessage(msg);  
  43.         }  
  44.     };  
  45.       
  46.     public Timer mTimer = new Timer();// 定时器  
  47.   
  48.     @Override  
  49.     public void onCreate(Bundle savedInstanceState) {  
  50.         super.onCreate(savedInstanceState);  
  51.         setContentView(R.layout.main);  
  52.         mTest = (Button) findViewById(R.id.teststart);  
  53.         mTest.setOnClickListener(this);  
  54.         timerTask(); // 定时执行  
  55.     }  
  56.   
  57.     public void onClick(View v) {  
  58.         try {  
  59.             if(mTimer!=null){  
  60.                 mTimer.cancel();// 退出之前的mTimer  
  61.             }  
  62.             mTimer = new Timer();// new一个Timer,否则会报错  
  63.             timerTask();  
  64.         } catch (IllegalStateException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.     }  
  68.   
  69.     public void timerTask() {  
  70.         //创建定时线程执行更新任务  
  71.         mTimer.schedule(new TimerTask() {  
  72.             @Override  
  73.             public void run() {  
  74.                 if(count<=50){  
  75.                     System.out.println("TimerTask-->Id is "  
  76.                             + Thread.currentThread().getId());// TimerTask在它自己的线程中  
  77.                     mHandler.sendEmptyMessage(1);// 向Handler发送消息  
  78.                 }else{  
  79.                     mHandler.sendEmptyMessage(2);// 向Handler发送消息停止继续执行  
  80.                 }  
  81.                 count++;  
  82.             }  
  83.         }, 30003000);// 定时任务  
  84.     }  
  85.     /** 
  86.      * 销毁定时器的方式 
  87.      */  
  88.     @Override  
  89.     protected void onStop() {  
  90.         mTimer.cancel();// 程序退出时cancel timer  
  91.         super.onStop();  
  92.     }  
  93.   
  94. }  

 

 

实例二

更新界面的方法

 

Java代码  收藏代码
  1. package com.etrip.handlers;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Looper;  
  7. import android.os.Message;  
  8. import android.util.Log;  
  9. import android.widget.Button;  
  10. /** 
  11.  *  
  12.  
  13.  *  
  14.  * @author longgangbai 
  15.  */  
  16. public class AndroidHandlerActivity extends Activity {  
  17.         Button button;  
  18.         MyHandler myHandler;  
  19.         int count=1;  
  20.   
  21.         protected void onCreate(Bundle savedInstanceState) {  
  22.             super.onCreate(savedInstanceState);  
  23.             setContentView(R.layout.handlertest);  
  24.   
  25.             button = (Button) findViewById(R.id.button);  
  26.             myHandler = new MyHandler();  
  27.            
  28.             // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据  
  29.             // Handler有两个作用,   
  30.             // (1) : 定时执行Message和Runnalbe 对象  
  31.             // (2): 让一个动作,在不同的线程中执行.  
  32.   
  33.             // 它安排消息,用以下方法  
  34.             // post(Runnable)  
  35.             // postAtTime(Runnable,long)  
  36.               
  37.               
  38.             // postDelayed(Runnable,long)  
  39.             myHandler.postDelayed(new MyThread(), 2000);//2s之后执行  
  40.               
  41.             //发送消息  
  42.             // sendEmptyMessage(int)  
  43.             // sendMessage(Message);  
  44.             // sendMessageAtTime(Message,long)  
  45.               
  46.             //        sendMessageAtTime的使用        
  47.             //          Message msg = new Message();  
  48.             //            Bundle b = new Bundle();// 存放数据  
  49.             //            b.putString("color", "我的");  
  50.             //            msg.setData(b);  
  51.             //          myHandler.sendMessageAtTime(msg, 2000);  
  52.                           
  53.             //          sendMessageDelayed(Message,long)  
  54.               
  55.             // 以上方法以 post开头的允许你处理Runnable对象  
  56.             //sendMessage()允许你处理Message对象(Message里可以包含数据,)  
  57.            
  58.         }  
  59.   
  60.         /** 
  61.          * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 
  62.         */  
  63.         class MyHandler extends Handler {  
  64.             public MyHandler() {  
  65.             }  
  66.   
  67.             public MyHandler(Looper L) {  
  68.                 super(L);  
  69.             }  
  70.   
  71.             /** 
  72.              * 子类必须重写此方法,接受数据 
  73.              * 接收消息并更新界面信息 
  74.              */  
  75.             @Override  
  76.             public void handleMessage(Message msg) {  
  77.                 // TODO Auto-generated method stub  
  78.                 Log.d("MyHandler""handleMessage......");  
  79.                 super.handleMessage(msg);  
  80.                 // 此处可以更新UI  
  81.                 Bundle b = msg.getData();  
  82.                 String color = b.getString("color");  
  83.                 AndroidHandlerActivity.this.button.append(color);  
  84.   
  85.             }  
  86.         }  
  87.   
  88.         class MyThread implements Runnable {  
  89.             public void run() {  
  90.                 Log.d("thread.......""mThread........");  
  91.                 Message msg = new Message();  
  92.                 Bundle b = new Bundle();// 存放数据  
  93.                 count+=1;  
  94.                 b.putString("color""我的"+count);  
  95.                 msg.setData(b);  
  96.                 AndroidHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI  
  97.             }  
  98.         }  
  99.   
  100.     }  
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4820次
    • 积分:269
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:16篇
    • 译文:0篇
    • 评论:1条
    最新评论