zoukankan      html  css  js  c++  java
  • 通过Handler与线程嵌套TimerTask实现循环交替任务 分类: Android 2015-07-24 16:14 162人阅读 评论(0) 收藏

    创建两个循环交替任务:10秒后,A任务执行。 A任务里面创建一个B任务200毫秒后执行,B任务里面又创建一个A任务10秒后执行,如此往复。

    1,首先采用Handler与线程的sleep(long)方法;

        Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。

    1. 定义一个Handler类,用于处理接受到的Message。

    1. Handler handler = new Handler() {  
    2.     public void handleMessage(Message msg) {  
    3.         // 要做的事情  
    4.         super.handleMessage(msg);  
    5.     }  
    6. };  
    2. 新建一个实现Runnable接口的线程类,如下:
    1. public class MyThread implements Runnable {  
    2.     @Override  
    3.     public void run() {  
    4.         // TODO Auto-generated method stub  
    5.         while (true) {  
    6.             try {  
    7.                 Thread.sleep(10000);// 线程暂停10秒,单位毫秒  
    8.                 Message message = new Message();  
    9.                 message.what = 1;  
    10.                 handler.sendMessage(message);// 发送消息  
    11.             } catch (InterruptedException e) {  
    12.                 // TODO Auto-generated catch block  
    13.                 e.printStackTrace();  
    14.             }  
    15.         }  
    16.     }  
    17. }  

    3. 在需要启动线程的地方加入下面语句:

    new Thread(new MyThread()).start();  

    4.测试类

    import java.util.Date;  
    import java.util.Timer;  
    import java.util.TimerTask;  
      
    /** 
     * @author Administrator  
     */  
    public class TraditionalTime2 {  
          
        /* 
         * 创建两个循环交替任务:10秒后,A任务执行。 
         * A任务里面创建一个B任务200毫秒后执行,B任务里面又创建一个A任务10秒后执行,如此往复。 
         *  
         */  
        public static void main(String[] args) {  
            TraditionalTime2 t2=new TraditionalTime2();  
            new Timer().schedule(t2.new A(), 10000);  
              
             //用于打印时间秒数  
            while (true) {  
                System.out.println(new Date().getSeconds());  
                try {  
                    Thread.sleep(1000);  
                } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }  
            }  
        }  
        class A extends TimerTask {  
            @Override  
            public void run() {  
                System.out.println("A bombing!");  
                new Timer().schedule(new B(), 200);  
      
            }  
      
        }  
      
        class B extends TimerTask {  
            @Override  
            public void run() {  
                System.out.println("B bombing!");  
                new Timer().schedule(new A(), 10000);  
      
            }  
        }  
    }  

    完整代码:

    	/**
    	 * 每隔10s发一次整包查询请求,10秒后,A(发送整个包查询)任务执行。
    	 * A(发送整包查询)任务里面创建一个B(发送查询一个ID包)任务200毫秒后执行
    	 */
    	// 查询数据
    	Handler handler = new Handler() {
    		public void handleMessage(Message msg) {
    			// 要做的事情发送查询请求
    			System.out.println("每隔10s发一次查询包请求");
    			/**
    			 * 枚举类型的遍历 
    			 * 间隔200ms,发下一个包;
    			 */
    			PackageId[] allPackageId = PackageId.values();
    			for (PackageId aPackageId : allPackageId) {
    //				System.out.println("200ms发一次查询id!");
    				System.out.println(" 当前名字: " + aPackageId.name());
    				System.out.println(" 当前序号: " + aPackageId.ordinal());
    				// System. out .println( " 当前: " + aPackageId);
    				byte[] data = { 0x01 };
    				PumpPackage myPackage = new PumpPackage(aPackageId, data);
    				util.writePort(myPackage.getSendArray());
    				// new Thread(new QueryThread()).start();
    				new Timer().schedule(new QueryPackageId(), 5000);//QueryPackageId 200毫秒后执行
    			}
    			
    			super.handleMessage(msg);
    		}
    	};
    
    	public class QueryThread implements Runnable {
    		@Override
    		public void run() {
    			while (true) {
    				try {
    					Thread.sleep(10000);// 线程暂停10秒,单位毫秒
    					Message message = new Message();
    					message.what = 1;
    					handler.sendMessage(message);// 发送消息
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    
    	/**
    	 * 间隔200毫秒发一个包id查询请求
    	 * @author sooner
    	 *
    	 */
    	class QueryPackageId extends TimerTask {
    		@Override
    		public void run() {			
    			System.out.println("200ms发一次查询id!");
    		}
    	}

    @Override
    public void didPackageReceived(blePort port, byte[] Received) {


    // 接收到数组 解码为包
    PumpPackage package1 = new PumpPackage(Received);
    // 返回数据有问题
    if (package1.isValid()) {
    mReceivedData = package1.toString();
    mReceivedId = package1.getPackageId();
    // mReceivedValue =package1.getDataArray().toString();
    // 包中需要的数据部分
    try {
    mReceivedValue = PumpPackage.bytesToInt(package1
    .getDataArray());
    } catch (Exception e) {
    e.printStackTrace();
    }
    System.out.println(mReceivedData);
    System.out.println(mReceivedId);
    System.out.println(mReceivedValue);
    //
    cs = String.valueOf(mReceivedValue);
    System.out.println(cs);
    // 接收到数据后更新UI状态
    PumpFragmentConnect.updateUiObjectState();
    PumpFragmentConnect.runRow();
    PumpFragmentConnect.updateUiObject((String) cs);
    }
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    PumpFragmentConnect.updateUiObject((String) cs);
    // mLastSecondTotalReceiveSize = mTotalReceiveSize;
    }
    });
    }


    调试记录:

    07-24 17:49:50.169: I/System.out(5251):  当前名字: UMToSlave_QuerySeq
    07-24 17:49:50.169: I/System.out(5251):  当前序号: 15
    07-24 17:49:50.179: D/ACSUtilityService(5251): There are 1 datas to be sended...
    07-24 17:49:50.179: D/ACSUtilityService(5251): sending data...count0
    07-24 17:49:50.179: D/ACSUtilityService(5251): writePort 1
    07-24 17:49:50.179: D/ACSUtilityService(5251): writePort 2
    07-24 17:49:50.179: D/ACSUtilityService(5251): writePort 3
    07-24 17:49:50.179: D/ACSUtilityService(5251): writePort 4
    07-24 17:49:50.179: D/ACSUtilityService(5251): data: [B@42afd448
    07-24 17:49:50.179: D/BluetoothGatt(5251): writeCharacteristic() - uuid: 0000ffb2-0000-1000-8000-00805f9b34fb
    07-24 17:49:50.189: D/BluetoothGatt(5251): onCharacteristicWrite() - Device=B4:99:4C:6E:33:1B UUID=0000ffb2-0000-1000-8000-00805f9b34fb Status=0
    07-24 17:49:50.189: D/ACSUtilityService(5251): onCharacteristicWrite
    07-24 17:49:50.189: D/ACSUtilityService(5251): notify workerThread
    07-24 17:49:50.189: D/ACSUtilityService(5251): synchronized...
    07-24 17:49:50.189: D/ACSUtilityService(5251): send succeed
    07-24 17:49:50.189: E/ACSUtility(5251): EventHandler got a message.flag is 8
    07-24 17:49:52.649: D/BluetoothGatt(5251): onNotify() - Device=B4:99:4C:6E:33:1B UUID=0000ffb2-0000-1000-8000-00805f9b34fb
    07-24 17:49:52.649: D/ACSUtilityService(5251): onCharacteristicChanged
    07-24 17:49:52.649: D/ACSUtilityService(5251): data line : length = 10
    07-24 17:49:52.659: E/ACSUtility(5251): EventHandler got a message.flag is 5
    07-24 17:49:52.659: W/System.err(5251): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
    07-24 17:49:52.659: W/System.err(5251): at com.brio.bluetooth.PumpPackage.bytesToInt(PumpPackage.java:234)
    07-24 17:49:52.659: W/System.err(5251): at com.brio.activity.StartActivity$1.didPackageReceived(StartActivity.java:186)
    07-24 17:49:52.659: W/System.err(5251): at com.brio.util.ACSUtility$2.handleMessage(ACSUtility.java:136)
    07-24 17:49:52.659: W/System.err(5251): at android.os.Handler.dispatchMessage(Handler.java:102)
    07-24 17:49:52.659: W/System.err(5251): at android.os.Looper.loop(Looper.java:136)
    07-24 17:49:52.659: W/System.err(5251): at android.app.ActivityThread.main(ActivityThread.java:5050)
    07-24 17:49:52.659: W/System.err(5251): at java.lang.reflect.Method.invokeNative(Native Method)
    07-24 17:49:52.659: W/System.err(5251): at java.lang.reflect.Method.invoke(Method.java:515)
    07-24 17:49:52.659: W/System.err(5251): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    07-24 17:49:52.659: W/System.err(5251): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
    07-24 17:49:52.659: W/System.err(5251): at dalvik.system.NativeStart.main(Native Method)
    07-24 17:49:52.659: I/System.out(5251): id:  UpperMoni_CmdInValid  length: 1  data: [-86, -69, 2, 0, 1, 102, -60, -12, -26, -73]
    07-24 17:49:52.659: I/System.out(5251): UpperMoni_CmdInValid
    07-24 17:49:52.659: I/System.out(5251): 0
    07-24 17:49:52.659: I/System.out(5251): 0

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/xieping/p/4714172.html
Copyright © 2011-2022 走看看