精华内容
下载资源
问答
  • 下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作demo。 需要注意问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新...
  • //delay: 从定时器初始化成功 开始启动的延迟时间。period:定时器的间隔时间 ​</code></pre> 希望各位大神在上面代码基础上,可以帮帮我想一个解决办法,定时器这个东西把我绕有些晕...
  • //设定Timer0工作在模式1,从而不影响定时器1的设定 TH0=初值的高字节; TL0=初值的低字节; EA=1;//开总中断 ET0=1;//中断允许,如果没有中断忽略这条语句 TR0=1;//启动定时器 } /*定时器1的配置函数*/ ...

    51单片机有两个定时器分别是定时器0和1,再同时使用时的注意事项:

    /*定时器0的配置函数*/

    void ConfigTimer0()

    {

    TMOD&=0xF0;//清空控制位

    TMOD|=0x01;//设定Timer0工作在模式1,从而不影响定时器1的设定

    TH0=初值的高字节;

    TL0=初值的低字节;

    EA=1;//开总中断

    ET0=1;//中断允许,如果没有中断忽略这条语句

    TR0=1;//启动定时器

    }

    /*定时器1的配置函数*/

    void ConfigTimer1()

    {

    TMOD&=0x0F;//清空控制位

    TMOD|=0x10;//设定Timer1工作在模式1,从而不影响定时器0的设定

    TH1=初值的高字节;

    TL1=初值的低字节;

    EA=1;//开总中断

    ET1=1;//中断允许,如果没有中断忽略这条语句

    TR1=1;//启动定时器

    }

    注意{定时器TMOD 的这样配置不影响TMOD其他位的设定。}

    展开全文
  • 下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作demo。 需要注意问题主要有两点: 1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,提示...
    下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。
    需要注意的问题主要有两点:
    1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,提示如下:

    D/AndroidRuntime( 6672): Shutting down VM  
    W/dalvikvm( 6672): threadid=1: thread exiting with uncaught exception (group=0x40018560)  
    E/AndroidRuntime( 6672): FATAL EXCEPTION: main  
    E/AndroidRuntime( 6672): java.lang.IllegalStateException: Timer was canceled  
    E/AndroidRuntime( 6672):    at java.util.Timer.scheduleImpl(Timer.java:563)  
    E/AndroidRuntime( 6672):    at java.util.Timer.schedule(Timer.java:483)  
    E/AndroidRuntime( 6672):    at com.snowdream.timerdemo.TimerDemoActivity$2.onClick(TimerDemoActivity.java:73)  
    E/AndroidRuntime( 6672):    at android.view.View.performClick(View.java:2501)  
    E/AndroidRuntime( 6672):    at android.view.View$PerformClick.run(View.java:9107)  
    E/AndroidRuntime( 6672):    at android.os.Handler.handleCallback(Handler.java:587)  
    E/AndroidRuntime( 6672):    at android.os.Handler.dispatchMessage(Handler.java:92)  
    E/AndroidRuntime( 6672):    at android.os.Looper.loop(Looper.java:130)  
    E/AndroidRuntime( 6672):    at android.app.ActivityThread.main(ActivityThread.java:3835)  
    E/AndroidRuntime( 6672):    at java.lang.reflect.Method.invokeNative(Native Method)  
    E/AndroidRuntime( 6672):    at java.lang.reflect.Method.invoke(Method.java:507)  
    E/AndroidRuntime( 6672):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)  
    E/AndroidRuntime( 6672):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)  
    E/AndroidRuntime( 6672):    at dalvik.system.NativeStart.main(Native Method)  
    W/ActivityManager(  154):   Force finishing activity com.snowdream.timerdemo/.TimerDemoActivity  
    W/ActivityManager(  154): Activity pause timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}  
    W/ActivityManager(  154): Activity destroy timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}  
    D/dalvikvm(  800): GC_EXPLICIT freed 13K, 58% free 3127K/7431K, external 0K/0K, paused 70ms  
    D/dalvikvm(  562): GC_EXPLICIT freed 59K, 51% free 2935K/5959K, external 245K/512K, paused 84ms  
    I/ActivityManager(  154): Start proc com.android.email for service com.android.email/.service.MailService: pid=6691 uid=10019 gids={3003, 1015}  
    
    2、只能在UI主线程中更新控件/组件。在其他线程中,更新控件/组件,会提示出错,提示如下: 
    (注:这种情况下,可以通过Hander发送消息的方式来更新控件/组件,详情参考例子。)

    E/AndroidRuntime( 6309): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.  
    E/AndroidRuntime( 6309):    at android.view.ViewRoot.checkThread(ViewRoot.java:2941)  
    E/AndroidRuntime( 6309):    at android.view.ViewRoot.invalidateChild(ViewRoot.java:643)  
    E/AndroidRuntime( 6309):    at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:669)  
    E/AndroidRuntime( 6309):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)  
    E/AndroidRuntime( 6309):    at android.view.View.invalidate(View.java:5296)  
    E/AndroidRuntime( 6309):    at android.widget.TextView.checkForRelayout(TextView.java:5533)  
    E/AndroidRuntime( 6309):    at android.widget.TextView.setText(TextView.java:2730)  
    E/AndroidRuntime( 6309):    at android.widget.TextView.setText(TextView.java:2598)  
    E/AndroidRuntime( 6309):    at android.widget.TextView.setText(TextView.java:2573)  
    E/AndroidRuntime( 6309):    at com.snowdream.timerdemo.TimerDemoActivity$1.run(TimerDemoActivity.java:48)  
    E/AndroidRuntime( 6309):    at java.util.Timer$TimerImpl.run(Timer.java:284)  
    

    Demo源码如下: TimerDemoActivity.java

    package com.snowdream.timerdemo;
    
    import java.util.Timer;  
    import java.util.TimerTask;  
    import android.app.Activity;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.util.Log;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.TextView;  
    
    
    public class TimerDemoActivity extends Activity {  
        private static String  TAG = "TimerDemo";  
        private TextView mTextView = null;  
        private Button mButton_start = null;  
        private Button mButton_pause = null;  
        private Timer mTimer = null;  
        private TimerTask mTimerTask = null;  
        private Handler mHandler = null;  
        private static int count = 0;  
        private boolean isPause = false;  
        private boolean isStop = true;  
        private static int delay = 1000;  //1s  
        private static int period = 1000;  //1s  
        private static final int UPDATE_TEXTVIEW = 0;  
          
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            mTextView = (TextView)findViewById(R.id.mytextview);   
            mButton_start = (Button)findViewById(R.id.mybutton_start);  
            mButton_pause = (Button)findViewById(R.id.mybutton_pause);  
    
    
            mButton_start.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View v) {  
                    if (isStop) {  
                        Log.i(TAG, "Start");  
                    } else {  
                        Log.i(TAG, "Stop");  
                    }  
      
                    isStop = !isStop;  
      
                    if (!isStop) {  
                        startTimer();  
                    }else {  
                        stopTimer();  
                    }  
      
                    if (isStop) {  
                        mButton_start.setText(R.string.start);  
                    } else {  
                        mButton_start.setText(R.string.stop);  
                    }  
                }  
            });  
      
            mButton_pause.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View v) {  
                    if (isPause) {  
                        Log.i(TAG, "Resume");  
                    } else {  
                        Log.i(TAG, "Pause");  
                    }  
      
                    isPause = !isPause;  
      
                    if (isPause) {  
                        mButton_pause.setText(R.string.resume);  
                    } else {  
                        mButton_pause.setText(R.string.pause);  
                    }  
                }  
            });  
              
            mHandler = new Handler(){  
                @Override  
                public void handleMessage(Message msg) {  
                    switch (msg.what) {  
                    case UPDATE_TEXTVIEW:  
                        updateTextView();  
                        break;  
                    default:  
                        break;  
                    }  
                }  
            };  
        }  
      
        private void updateTextView(){  
            mTextView.setText(String.valueOf(count));  
        }  
      
        private void startTimer(){  
            if (mTimer == null) {  
                mTimer = new Timer();  
            }  
      
            if (mTimerTask == null) {  
                mTimerTask = new TimerTask() {  
                    @Override  
                    public void run() {  
                        Log.i(TAG, "count: "+String.valueOf(count));  
                        sendMessage(UPDATE_TEXTVIEW);  
                          
                        do {  
                            try {  
                                Log.i(TAG, "sleep(1000)...");  
                                Thread.sleep(1000);  
                            } catch (InterruptedException e) {  
                            }     
                        } while (isPause);  
                          
                        count ++;    
                    }  
                };  
            }  
      
            if(mTimer != null && mTimerTask != null )  
                mTimer.schedule(mTimerTask, delay, period);  
      
        }  
      
        private void stopTimer(){  
            if (mTimer != null) {  
                mTimer.cancel();  
                mTimer = null;  
            }  
            if (mTimerTask != null) {  
                mTimerTask.cancel();  
                mTimerTask = null;  
            }     
            count = 0;  
        }  
          
        public void sendMessage(int id){  
            if (mHandler != null) {  
                Message message = Message.obtain(mHandler, id);     
                mHandler.sendMessage(message);   
            }  
        }  
    }  
    


    layout-main.xml 

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
      android:layout_width="fill_parent"  
      android:layout_height="fill_parent"  
      android:orientation="vertical" >  
      <TextView  
        android:id="@+id/mytextview"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:gravity="center"  
        android:text="@string/number" />  
      
      <LinearLayout  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:gravity="center"  
        android:orientation="horizontal" >  
     
      <Button  
        android:id="@+id/mybutton_start"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="@string/start" />  
     
      <Button  
        android:id="@+id/mybutton_pause"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="@string/pause" />  
      </LinearLayout>  
    </LinearLayout>  
    

    strings.xml

    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
      <string name="app_name">TimerDemo</string>  
      <string name="number">0</string>  
      <string name="start">start</string>  
      <string name="stop">stop</string>  
      <string name="pause">pause</string>  
      <string name="resume">resume</string>  
    </resources>  
    
    源码下载:http://download.csdn.net/detail/yang_hui1986527/3922447
    展开全文
  • JavaScript 循环语句3. JavaScript 定时器4. JavaScript 函数事件类型分为几大类分别是:1.焦点事件2.鼠标与滚轮事件3.键盘和文本事件事件( HTML 4.0 新特性之一是有能力使 HTML 事件触发浏览器中动作(action),...

    知识总结:李小龙、杨佳培

    【目录】

    1.     JavaScript 事件

    2.     JavaScript 循环语句

    3.     JavaScript 定时器

    4.     JavaScript 函数

    事件类型分为几大类分别是:

    1.   焦点事件

    2.   鼠标与滚轮事件

    3.键盘和文本事件

    事件( HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript)

    1. 1.焦点事件:

       onblur在元素失去焦点时触发

       onfocus在元素获得焦点时触发

    1. 2.鼠标事件

      onclick 左键单击

    ondbclick 双击鼠标

    onmousedown---在用户按下了任意鼠标按钮时触发

    onmouseenter-鼠标光标从元素外部首次移动到元素范围内时触发

    onmouseleave---元素上方的光标移动到元素范围之外时触发

    mousemove---光标在元素的内部不断的移动时触发

    mouseover---鼠标指针位于一个元素外部,然后用户将首次移动到另一个元素边界之内

    时触发。

    mouseup---在用户释放鼠标按钮时触发。

    1. 3.文本与键盘事件

    keydown:当用户按下键盘上的任意键时触发。按住不放,会重复触发。

    keypress:当用户按下键盘上的字符键时触发。按住不放,会重复触发。

    keyup:当用户释放键盘上的键时触发。

    textInput:这是唯一的文本事件,用意是将文本显示给用户之前更容易拦截文本。

    JavaScript 循环语句

    1. 1.for循环

     ( for 循环是 Js 中最常用的一个循环工具,经常用于数组的循环遍历。格式就是for(下标变量;循环长度,下标递加){})

    用for循环打印到页面的99乘法表

    1. 2.while 循环

    (break不能在if里面用,但是可以在循环里面用,所以用while这样的循环语句可以中断代码的执行,理论上所有循环都可以实现该功能,选择while是因为它简洁而且可以代替if做判断。)

    用while循环 做的一个简易的银行小功能

    1. 1.  JavaScript 定时器

    setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。

    setTimeout() :在指定的毫秒数后调用函数或计算表达式。

    (延时调用)

    JavaScript 函数

    ( 函数是被设计为执行特定任务的代码块,函数会在某代码调用它时被执行。)

    函数的种类分为:

    1. 1.普通函数

    2. 2.匿名函数

    3. 3.箭头函数

    普通函数求和 

    匿名函数求和

    箭头函数求和

    以下用学习的JS来实现贪“吃蛇的案例”,“贪吃蛇案例”用到了上面的所有知识点--

    下面是是展示的效果图

    ceff6515b0c3577ac7fbb38eecd45d0c.png

    以下是贪吃蛇代码

    <script>

            let snakeArray = []; /*初始化蛇关节的数组*/

            let isPause = false; /*游戏是否暂停:未暂停*/

            let snakeSize = 5; /*蛇的初始长度*/

            let direct = "right"; /*蛇初始方向:向右*/

            let speed = 130; /*蛇移动初始速度:80*/

            let score, timer, board, bean; /*游戏初始分数显示区,定时器,面板,豆*/

            // 初始化(){

            onload = () => {

                //     初始化游戏面板和游戏分数显示区

                board = document.querySelector("#board");

                score = document.querySelector("#score");

                // //     造蛇()

                createSnake();

                //     造豆()

                createBean();

                // //     监听键盘()

                keyListener();

            };

            function createSnake() {

                //     循环蛇初始化长度次{

                for (let i = 0; i < snakeSize; i++) {

                    //         创造蛇的新关节,每个关节都是一个div

                    let snake = document.createElement("div");

                    //         蛇头变红

                    if (i === 0) {

                        snake["style"]["backgroundColor"] = "red";

                    }

                    //         蛇的新关节推入数组

                    snakeArray.push(snake);

                    //         蛇的新关节的左距离为上一个蛇关节左侧

                    snake["style"]["left"] = (snakeSize - i - 1) * 20 + "px";

                    //         蛇的新关节展示在面板上

                    board.appendChild(snake);

                }

            }

            // 造豆(){

            function createBean() {

                //     if(存在旧豆){

                if (bean) {

                    //     从游戏面板上删除旧豆

                    board.removeChild(bean);

                }

                //     创建新豆,每个豆都是一个span

                bean = document.createElement("span");

                let x = null, y = null;

                //     调用随机坐标(),为新豆生成出生坐标

                randomXY();

                //     随机坐标(){

                function randomXY() {

                    //         面板宽度1000除以20(豆子宽20px),等分成500份

                    //         乘以一个随机数并取整,得出一个0-500的整数

                    //         乘以20得到一个0-1000范围内的20的整数倍,即横坐标

                    //         纵坐标同理

                    x = parseInt("" + (Math.random() * (1000 / 20))) * 20;

                    y = parseInt("" + (Math.random() * (500 / 20))) * 20;

                    //         遍历蛇关节数组{

                    for (let i = 0; i < snakeArray.length; i++) {

                        //             if(和当前豆的坐标冲突){

                        if (snakeArray[i]["offsetLeft"] === x) {

                            if (snakeArray[i]["offsetTop"] === y) {

                                //                 随机坐标();

                                randomXY();

                                break;

                            }

                        }

                    }

                }

                //     为新豆赋值横纵坐标

                bean["style"]["left"] = x + "px";

                bean["style"]["top"] = y + "px";

                //     将新豆追加到面板中

                board.appendChild(bean);

            }

        //     //监听键盘

            function keyListener() {

                document.onkeydown = event => {

                    let oEvent = event || window.event;

                    switch (oEvent.keyCode) {

                        case 37:

                            //     按了左键:当方向不为右,方向改为左

                            if (direct !== "right") {

                                direct = "left";

                            }

                            break;

                        case 38:

                            //     按了上键:当方向不为下,方向改为上

                            if (direct !== "down") {

                                direct = "up";

                            }

                            break;

                        case 39:

                            //     按了右键:当方向不为左,方向改为右

                            if (direct !== "left") {

                                direct = "right";

                            }

                            break;

                        case 40:

                            //     按了下键:当方向不为上,方向改为下

                            if (direct !== "up") {

                                direct = "down";

                            }

                            break;

                        case 32:

                            //     按了空格键:暂停和开始游戏效果切换

                            if (!isPause) {

                                pause();

                            } else {

                                start();

                            }

                            isPause = !isPause;

                            break;

                    }

                }

            }

            // 游戏开始(){

            function start() {

                //     清除旧定时器

                clearInterval(timer);

                //     开启新定时器{

                timer = setInterval(() => {

                    //     蛇移动()

                    board = document.querySelector("#board");

                    move();

                    //     撞自己():判断本次移动蛇是否撞到自己

                    isHit();

                    //      吃豆子():判断本次移动蛇是否吃到豆子

                    isEat();

                    board.style.background="linear-gradient(45deg," + getColor() + "," + getColor() +

                        "," + getColor() + ")";

                }, speed);

            }

            // 蛇移动(){

            function move() {

                //     获取蛇头左距离和上距离

                let hLeft = snakeArray[0].offsetLeft;

                let hTop = snakeArray[0].offsetTop;

                //     判断当前蛇的移动方向{

                switch (direct) {

                    case "left":

                        //         if(对应方向上出界){

                        if (hLeft <= 0) {

                            //             游戏结束()

                            gameover();

                            return;

                        }

                        //         蛇身移动()

                        snakeBodyMove();

        //                 //         蛇头移动

                        snakeArray[0]["style"]["left"] = hLeft - 20 + "px";

                        break;

                    case "up":

                        if (hTop <= 0) {

                            gameover();

                            return;

                        }

                        snakeBodyMove();

                        snakeArray[0]["style"]["top"] = hTop - 20 + "px";

                        break;

                    case "right":

                        if (hLeft >= 1000 - 20) {

                            gameover();

                            return;

                        }

                        snakeBodyMove();

                        snakeArray[0]["style"]["left"] = hLeft + 20 + "px";

                        break;

                    case "down":

                        if (hTop >= 500 - 20) {

                            gameover();

                            return;

                        }

                        snakeBodyMove();

                        snakeArray[0]["style"]["top"] = hTop + 20 + "px";

                        break;

                }

                //     蛇身移动(){

                function snakeBodyMove() {

                    //         循环所有蛇身{

                    for (let i = snakeArray.length - 1; i > 0; i--) {

                        //             后面的关节横向顶替前面的关节

                        snakeArray[i]["style"]["left"] = snakeArray[i - 1]["style"]["left"];

                        //             后面的关节纵向顶替前面的关节

                        snakeArray[i]["style"]["top"] = snakeArray[i - 1]["style"]["top"];

                    }

                }

            }

            /*判断本次移动是否撞到自己*/

            function isHit() {

                //     遍历所有蛇身{

                for (let i = 1, j = snakeArray.length; i < j; i++) {

                    //         if(蛇头坐标与某个蛇身关节坐标冲突){

                    if (snakeArray[0].offsetLeft === snakeArray[i].offsetLeft) {

                        if (snakeArray[0].offsetTop === snakeArray[i].offsetTop) {

                            //             结束游戏()

                            gameover();

                            break;

                        }

                    }

                }

            }

            // 吃豆子(){

            function isEat() {

                //     if(蛇头坐标和当前豆的坐标一致){

                if (snakeArray[0].offsetLeft === bean.offsetLeft) {

                    if (snakeArray[0].offsetTop === bean.offsetTop) {

                        //         分数++

                        score.innerText = parseInt(score.innerText) + 1;

                        //         创建一个新的蛇关节

                        let snake = document.createElement("div");

                        //         新蛇关节的出生坐标就是被吃掉豆子的坐标

                        snake["style"]["left"] = bean["style"]["left"];

                        snake["style"]["top"] = bean["style"]["top"];

                        //         新蛇关节加入到蛇的数组中

                        snakeArray.push(snake);

                        //         新蛇关节展示在游戏面板中

                        board.appendChild(snake);

                        //         造豆()

                        createBean();

                    }

                }

            }

            // 游戏结束(){

            function gameover() {

                //     清空定时器

                clearInterval(timer);

                //     刷新页面

                location.reload();

                //     提示游戏结束

                alert("game over!");

            }

            // 游戏暂停(){

            function pause() {

                //     清空定时器

                clearInterval(timer)

            }

            // 游戏重置(){

            function reset() {

                //     刷新页面

                location.reload();

            }

            function getColor() {

                var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']

                var a = '#'

                for (var i = 0; i < 6; i++) {

                    a += arr[getRandom(0arr.length - 1)]

                }

                return a; // 返回

            }

            function getRandom(min, max) {

                return Math.floor(Math.random() * (max - min + 1) - min)

            }

        script>

    以上就是我们总结的本节内容,文中有不当之处还希望大家之处,我们一起进步。

    展开全文
  • 下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作demo。需要注意问题主要有两点:1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,提示如下:D...

    下面是一个在Android中使用定时器Timer和TimerTask的启动,停止,暂停,继续等操作的demo。

    需要注意的问题主要有两点:

    1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句,否则提示出错,提示如下:

    D/AndroidRuntime(6672): Shutting down VM

    W/dalvikvm(6672): threadid=1: thread exiting with uncaught exception (group=0x40018560)

    E/AndroidRuntime(6672): FATAL EXCEPTION: main

    E/AndroidRuntime(6672): java.lang.IllegalStateException: Timer was canceled

    E/AndroidRuntime(6672): at java.util.Timer.scheduleImpl(Timer.java:563)

    E/AndroidRuntime(6672): at java.util.Timer.schedule(Timer.java:483)

    E/AndroidRuntime(6672): at com.snowdream.timerdemo.TimerDemoActivity$2.onClick(TimerDemoActivity.java:73)

    E/AndroidRuntime(6672): at android.view.View.performClick(View.java:2501)

    E/AndroidRuntime(6672): at android.view.View$PerformClick.run(View.java:9107)

    E/AndroidRuntime(6672): at android.os.Handler.handleCallback(Handler.java:587)

    E/AndroidRuntime(6672): at android.os.Handler.dispatchMessage(Handler.java:92)

    E/AndroidRuntime(6672): at android.os.Looper.loop(Looper.java:130)

    E/AndroidRuntime(6672): at android.app.ActivityThread.main(ActivityThread.java:3835)

    E/AndroidRuntime(6672): at java.lang.reflect.Method.invokeNative(Native Method)

    E/AndroidRuntime(6672): at java.lang.reflect.Method.invoke(Method.java:507)

    E/AndroidRuntime(6672): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)

    E/AndroidRuntime(6672): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)

    E/AndroidRuntime(6672): at dalvik.system.NativeStart.main(Native Method)

    W/ActivityManager(154): Force finishing activity com.snowdream.timerdemo/.TimerDemoActivity

    W/ActivityManager(154): Activity pause timeoutforHistoryRecord{40550560com.snowdream.timerdemo/.TimerDemoActivity}

    W/ActivityManager(154): Activity destroy timeoutforHistoryRecord{40550560com.snowdream.timerdemo/.TimerDemoActivity}

    D/dalvikvm(800): GC_EXPLICIT freed 13K,58% free 3127K/7431K, external 0K/0K, paused 70ms

    D/dalvikvm(562): GC_EXPLICIT freed 59K,51% free 2935K/5959K, external 245K/512K, paused 84ms

    I/ActivityManager(154): Start proc com.android.emailforservice com.android.email/.service.MailService: pid=6691uid=10019gids={3003,1015}

    D/AndroidRuntime( 6672): Shutting down VM

    W/dalvikvm( 6672): threadid=1: thread exiting with uncaught exception (group=0x40018560)

    E/AndroidRuntime( 6672): FATAL EXCEPTION: main

    E/AndroidRuntime( 6672): java.lang.IllegalStateException: Timer was canceled

    E/AndroidRuntime( 6672): at java.util.Timer.scheduleImpl(Timer.java:563)

    E/AndroidRuntime( 6672): at java.util.Timer.schedule(Timer.java:483)

    E/AndroidRuntime( 6672): at com.snowdream.timerdemo.TimerDemoActivity$2.onClick(TimerDemoActivity.java:73)

    E/AndroidRuntime( 6672): at android.view.View.performClick(View.java:2501)

    E/AndroidRuntime( 6672): at android.view.View$PerformClick.run(View.java:9107)

    E/AndroidRuntime( 6672): at android.os.Handler.handleCallback(Handler.java:587)

    E/AndroidRuntime( 6672): at android.os.Handler.dispatchMessage(Handler.java:92)

    E/AndroidRuntime( 6672): at android.os.Looper.loop(Looper.java:130)

    E/AndroidRuntime( 6672): at android.app.ActivityThread.main(ActivityThread.java:3835)

    E/AndroidRuntime( 6672): at java.lang.reflect.Method.invokeNative(Native Method)

    E/AndroidRuntime( 6672): at java.lang.reflect.Method.invoke(Method.java:507)

    E/AndroidRuntime( 6672): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)

    E/AndroidRuntime( 6672): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)

    E/AndroidRuntime( 6672): at dalvik.system.NativeStart.main(Native Method)

    W/ActivityManager( 154): Force finishing activity com.snowdream.timerdemo/.TimerDemoActivity

    W/ActivityManager( 154): Activity pause timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}

    W/ActivityManager( 154): Activity destroy timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}

    D/dalvikvm( 800): GC_EXPLICIT freed 13K, 58% free 3127K/7431K, external 0K/0K, paused 70ms

    D/dalvikvm( 562): GC_EXPLICIT freed 59K, 51% free 2935K/5959K, external 245K/512K, paused 84ms

    I/ActivityManager( 154): Start proc com.android.email for service com.android.email/.service.MailService: pid=6691 uid=10019 gids={3003, 1015}

    2、只能在UI主线程中更新控件/组件。在其他线程中,更新控件/组件,会提示出错,提示如下:

    (注:这种情况下,可以通过Hander发送消息的方式来更新控件/组件,详情参考例子。)

    E/AndroidRuntime(6309): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    E/AndroidRuntime(6309): at android.view.ViewRoot.checkThread(ViewRoot.java:2941)

    E/AndroidRuntime(6309): at android.view.ViewRoot.invalidateChild(ViewRoot.java:643)

    E/AndroidRuntime(6309): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:669)

    E/AndroidRuntime(6309): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)

    E/AndroidRuntime(6309): at android.view.View.invalidate(View.java:5296)

    E/AndroidRuntime(6309): at android.widget.TextView.checkForRelayout(TextView.java:5533)

    E/AndroidRuntime(6309): at android.widget.TextView.setText(TextView.java:2730)

    E/AndroidRuntime(6309): at android.widget.TextView.setText(TextView.java:2598)

    E/AndroidRuntime(6309): at android.widget.TextView.setText(TextView.java:2573)

    E/AndroidRuntime(6309): at com.snowdream.timerdemo.TimerDemoActivity$1.run(TimerDemoActivity.java:48)

    E/AndroidRuntime(6309): at java.util.Timer$TimerImpl.run(Timer.java:284)

    E/AndroidRuntime( 6309): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    E/AndroidRuntime( 6309): at android.view.ViewRoot.checkThread(ViewRoot.java:2941)

    E/AndroidRuntime( 6309): at android.view.ViewRoot.invalidateChild(ViewRoot.java:643)

    E/AndroidRuntime( 6309): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:669)

    E/AndroidRuntime( 6309): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)

    E/AndroidRuntime( 6309): at android.view.View.invalidate(View.java:5296)

    E/AndroidRuntime( 6309): at android.widget.TextView.checkForRelayout(TextView.java:5533)

    E/AndroidRuntime( 6309): at android.widget.TextView.setText(TextView.java:2730)

    E/AndroidRuntime( 6309): at android.widget.TextView.setText(TextView.java:2598)

    E/AndroidRuntime( 6309): at android.widget.TextView.setText(TextView.java:2573)

    E/AndroidRuntime( 6309): at com.snowdream.timerdemo.TimerDemoActivity$1.run(TimerDemoActivity.java:48)

    E/AndroidRuntime( 6309): at java.util.Timer$TimerImpl.run(Timer.java:284)

    Demo源码如下:

    TimerDemoActivity.java

    packagecom.snowdream.timerdemo;

    importjava.util.Timer;

    importjava.util.TimerTask;

    importandroid.app.Activity;

    importandroid.os.Bundle;

    importandroid.os.Handler;

    importandroid.os.Message;

    importandroid.util.Log;

    importandroid.view.View;

    importandroid.widget.Button;

    importandroid.widget.TextView;

    publicclassTimerDemoActivityextendsActivity {

    privatestaticString TAG ="TimerDemo";

    privateTextView mTextView =null;

    privateButton mButton_start =null;

    privateButton mButton_pause =null;

    privateTimer mTimer =null;

    privateTimerTask mTimerTask =null;

    privateHandler mHandler =null;

    privatestaticintcount =0;

    privatebooleanisPause =false;

    privatebooleanisStop =true;

    privatestaticintdelay =1000;//1s

    privatestaticintperiod =1000;//1s

    privatestaticfinalintUPDATE_TEXTVIEW =0;

    @Override

    publicvoidonCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mTextView = (TextView)findViewById(R.id.mytextview);

    mButton_start = (Button)findViewById(R.id.mybutton_start);

    mButton_pause = (Button)findViewById(R.id.mybutton_pause);

    mButton_start.setOnClickListener(newButton.OnClickListener() {

    publicvoidonClick(View v) {

    if(isStop) {

    Log.i(TAG,"Start");

    }else{

    Log.i(TAG,"Stop");

    }

    isStop = !isStop;

    if(!isStop) {

    startTimer();

    }else{

    stopTimer();

    }

    if(isStop) {

    mButton_start.setText(R.string.start);

    }else{

    mButton_start.setText(R.string.stop);

    }

    }

    });

    mButton_pause.setOnClickListener(newButton.OnClickListener() {

    publicvoidonClick(View v) {

    if(isPause) {

    Log.i(TAG,"Resume");

    }else{

    Log.i(TAG,"Pause");

    }

    isPause = !isPause;

    if(isPause) {

    mButton_pause.setText(R.string.resume);

    }else{

    mButton_pause.setText(R.string.pause);

    }

    }

    });

    mHandler =newHandler(){

    @Override

    publicvoidhandleMessage(Message msg) {

    switch(msg.what) {

    caseUPDATE_TEXTVIEW:

    updateTextView();

    break;

    default:

    break;

    }

    }

    };

    }

    privatevoidupdateTextView(){

    mTextView.setText(String.valueOf(count));

    }

    privatevoidstartTimer(){

    if(mTimer ==null) {

    mTimer =newTimer();

    }

    if(mTimerTask ==null) {

    mTimerTask =newTimerTask() {

    @Override

    publicvoidrun() {

    Log.i(TAG,"count: "+String.valueOf(count));

    sendMessage(UPDATE_TEXTVIEW);

    do{

    try{

    Log.i(TAG,"sleep(1000)...");

    Thread.sleep(1000);

    }catch(InterruptedException e) {

    }

    }while(isPause);

    count ++;

    }

    };

    }

    if(mTimer !=null&& mTimerTask !=null)

    mTimer.schedule(mTimerTask, delay, period);

    }

    privatevoidstopTimer(){

    if(mTimer !=null) {

    mTimer.cancel();

    mTimer =null;

    }

    if(mTimerTask !=null) {

    mTimerTask.cancel();

    mTimerTask =null;

    }

    count =0;

    }

    publicvoidsendMessage(intid){

    if(mHandler !=null) {

    Message message = Message.obtain(mHandler, id);

    mHandler.sendMessage(message);

    }

    }

    }

    package com.snowdream.timerdemo;

    import java.util.Timer;

    import java.util.TimerTask;

    import android.app.Activity;

    import android.os.Bundle;

    import android.os.Handler;

    import android.os.Message;

    import android.util.Log;

    import android.view.View;

    import android.widget.Button;

    import android.widget.TextView;

    public class TimerDemoActivity extends Activity {

    private static String TAG = "TimerDemo";

    private TextView mTextView = null;

    private Button mButton_start = null;

    private Button mButton_pause = null;

    private Timer mTimer = null;

    private TimerTask mTimerTask = null;

    private Handler mHandler = null;

    private static int count = 0;

    private boolean isPause = false;

    private boolean isStop = true;

    private static int delay = 1000; //1s

    private static int period = 1000; //1s

    private static final int UPDATE_TEXTVIEW = 0;

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mTextView = (TextView)findViewById(R.id.mytextview);

    mButton_start = (Button)findViewById(R.id.mybutton_start);

    mButton_pause = (Button)findViewById(R.id.mybutton_pause);

    mButton_start.setOnClickListener(new Button.OnClickListener() {

    public void onClick(View v) {

    if (isStop) {

    Log.i(TAG, "Start");

    } else {

    Log.i(TAG, "Stop");

    }

    isStop = !isStop;

    if (!isStop) {

    startTimer();

    }else {

    stopTimer();

    }

    if (isStop) {

    mButton_start.setText(R.string.start);

    } else {

    mButton_start.setText(R.string.stop);

    }

    }

    });

    mButton_pause.setOnClickListener(new Button.OnClickListener() {

    public void onClick(View v) {

    if (isPause) {

    Log.i(TAG, "Resume");

    } else {

    Log.i(TAG, "Pause");

    }

    isPause = !isPause;

    if (isPause) {

    mButton_pause.setText(R.string.resume);

    } else {

    mButton_pause.setText(R.string.pause);

    }

    }

    });

    mHandler = new Handler(){

    @Override

    public void handleMessage(Message msg) {

    switch (msg.what) {

    case UPDATE_TEXTVIEW:

    updateTextView();

    break;

    default:

    break;

    }

    }

    };

    }

    private void updateTextView(){

    mTextView.setText(String.valueOf(count));

    }

    private void startTimer(){

    if (mTimer == null) {

    mTimer = new Timer();

    }

    if (mTimerTask == null) {

    mTimerTask = new TimerTask() {

    @Override

    public void run() {

    Log.i(TAG, "count: "+String.valueOf(count));

    sendMessage(UPDATE_TEXTVIEW);

    do {

    try {

    Log.i(TAG, "sleep(1000)...");

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    }

    } while (isPause);

    count ++;

    }

    };

    }

    if(mTimer != null && mTimerTask != null )

    mTimer.schedule(mTimerTask, delay, period);

    }

    private void stopTimer(){

    if (mTimer != null) {

    mTimer.cancel();

    mTimer = null;

    }

    if (mTimerTask != null) {

    mTimerTask.cancel();

    mTimerTask = null;

    }

    count = 0;

    }

    public void sendMessage(int id){

    if (mHandler != null) {

    Message message = Message.obtain(mHandler, id);

    mHandler.sendMessage(message);

    }

    }

    }

    layout-main.xml

    分享:

    a4c26d1e5885305701be709a3d33442f.png喜欢

    0

    a4c26d1e5885305701be709a3d33442f.png赠金笔

    加载中,请稍候......

    评论加载中,请稍候...

    发评论

    登录名: 密码: 找回密码 注册记住登录状态

    昵   称:

    评论并转载此博文

    a4c26d1e5885305701be709a3d33442f.png

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

    展开全文
  • 应该是先执行定时器内的语句再赋值,假设是先赋值timer为定时器1(0s时触发的定时器),那么在执行clearInterval(timer)时,先赋值timer为定时器1(0s时触发的定时器),直接清空定时器1,clearInterval下面的语句则...
  • 当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。事件取代了原先只能由操作系统计划任务来执行工作,而且M...
  • 这里就是一种方法,通过检测TCON寄存器TF0位——定时器0中断溢出标志位,监测定时器溢出情况,从而判断是否印发了中断,并在if语句中写中断需要命令即可 一个例子: void Timer0Init() { TMOD|=0X01;//选择为...
  • 1章 从两个最简单驱动谈起 本章向读者呈现两个最简单Windows驱动程序,一个是NT式驱动程序,另一个是WDM式驱动程序。这两个驱动程序没有操作具体硬件设备,只是在系统里创建了虚拟设备。在随后章节中...
  • TR0 置1 ,启动定时/计数器T0 对单片机机器周期计数,同时检测方波第 三个下降沿;当判定检测到第三个下降沿时TR0 清0 ,停止计数,然后从计数 寄存器T0 读出测量数据,在完成数据处理后,由显示电路显示测量...
  • //启动定时器0 dis30s(); player(); }}void main(){ TMOD=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1;//打开定时器0中断允许 EA=1;//打开总...
  • N76E003红外解码程序

    2020-04-25 09:52:31
    只是简单的启动LED灯 使用是日本 NEC协议 外部定时器中断1 定时器模式2,8位自动重装 256步溢出一次 16M晶振 判断语句那里自己集合了好多想了一个案例 定义一个16位数字 将代码用户码反码和键码正码一起判断 ...
  • Timer [vaynexiao]

    2021-03-10 22:38:32
    利用定时器每过一秒打印1,这我们使用普通语句for循环中间加载一个Thread.sleep()也可以实现, 但区别很大不一样,Java程序是一个线程,而定时器是新开一个线程,也就是说此时同时两个人在完成我们指定事情。并...
  • 1.首先到Qt 官方网站上下载Qt Creator,这里我们下载windows 版。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按...
  • PID算法运用

    2015-06-14 20:23:54
    下面if语句结合定时器来决定PID算法多久执行一次。PID_Operation()函数看似很复杂,其实就一直在做一件事:根据提供数据,用PID公式把最终PID值算出来。 [C] 纯文本查看 复制代码 ? 001 002 003 004 005 006...
  • 定时器1的溢出率控制) SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据 REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许) EA=1;//开总中断 ES=1...
  • 一本很好书《21天学通C#》

    热门讨论 2010-07-25 18:28:53
    1章 C#概述(精彩视频:51分钟) 21 1.1 C#简介 21 1.1.1 C#由来 21 1.1.2 C#特点 22 1.1.3 C#与C++区别 23 1.2 .NET结构 24 1.2.1 虚拟执行系统 24 1.2.2 元数据 24 1.2.3 通用语言规范 24 ...
  • if(((clock1[0]==time[1])&&(clock1[1]==time[2])&&(clocken1==0)&&stop)||((clock2[0]==time[1])&&(clock2[1]==time[2])&&(clocken2==0)&&stop)) //stop 作为控制闹钟闹铃标志位。 { PWM0H=205;PWM1L=...
  • Visual Basic 2010入门经典.part1.rar

    热门讨论 2012-09-26 11:30:12
    13.1.4 在一条Case语句中考虑多个可能值 225 13.1.5 创建Select Case示例 225 13.1.6 创造性地使用Select Case 227 13.2 在过程中使用GoTo实现分支 228 13.3 总结 230 13.4 问与答 230 13.5 作业 230 ...
  • 8.5 其他几个有用的语句 8.6 数值处理 8.7 数组 8.8 函数 8.9 here文档 8.10 exec命令 8.11 trap命令 8.12 调试脚本程序 第二部分 Linux 内核分析与实践 第9章 编译Linux内核 9.1 Linux内核 9.2 查找并且下载一份...

空空如也

空空如也

1 2 3 4
收藏数 71
精华内容 28
关键字:

启动定时器1的语句是