android 实现倒计时和计时的5种方法

来源:互联网 发布:如何练形体气质知乎 编辑:程序博客网 时间:2024/05/20 17:26

第一种    Timer与TimerTask(Java实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
publicclass timerTask extendsActivity{ 
  
    privateint recLen = 11
    privateTextView txtView; 
    Timer timer = newTimer(); 
  
    publicvoid onCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
           
        setContentView(R.layout.timertask); 
        txtView = (TextView)findViewById(R.id.txttime); 
           
        timer.schedule(task, 1000, 1000);       // timeTask 
    }    
  
    TimerTask task = newTimerTask() { 
        @Override 
        publicvoid run() { 
  
            runOnUiThread(newRunnable() {      // UI thread 
                @Override 
                publicvoid run() { 
                    recLen--; 
                    txtView.setText(""+recLen); 
                    if(recLen < 0){ 
                        timer.cancel(); 
                        txtView.setVisibility(View.GONE); 
                    
                
            }); 
        
    }; 
}

方法二 
TimerTask与Handler(不用Timer的改进型)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
publicclasstimerTask extendsActivity{ 
    privateintrecLen = 11
    privateTextView txtView; 
    Timer timer = newTimer(); 
  
    publicvoidonCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
  
        setContentView(R.layout.timertask); 
        txtView = (TextView)findViewById(R.id.txttime); 
  
        timer.schedule(task, 1000, 1000);       // timeTask 
    }    
  
    finalHandler handler = newHandler(){ 
        @Override 
        publicvoidhandleMessage(Message msg){ 
            switch(msg.what) { 
            case1
                txtView.setText(""+recLen); 
                if(recLen < 0){ 
                    timer.cancel(); 
                    txtView.setVisibility(View.GONE); 
                
            
        
    }; 
  
    TimerTask task = newTimerTask() { 
        @Override 
        publicvoidrun() { 
            recLen--; 
            Message message = newMessage(); 
            message.what = 1
            handler.sendMessage(message); 
        
    }; 
}

方法三

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Handler与Message(不用TimerTask)
 
publicclasstimerTask extendsActivity{ 
    privateintrecLen = 11
    privateTextView txtView; 
  
    publicvoidonCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
  
        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime); 
  
        Message message = handler.obtainMessage(1);     // Message 
        handler.sendMessageDelayed(message, 1000); 
    }   
  
    finalHandler handler = newHandler(){ 
  
        publicvoidhandleMessage(Message msg){         // handle message 
            switch(msg.what) { 
            case1
                recLen--; 
                txtView.setText(""+ recLen); 
  
                if(recLen > 0){ 
                    Message message = handler.obtainMessage(1); 
                    handler.sendMessageDelayed(message, 1000);      // send message 
                }else
                    txtView.setVisibility(View.GONE); 
                
            
  
            super.handleMessage(msg); 
        
    }; 
}

方法四 

Handler与Thread(不占用UI线程)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
publicclasstimerTask extendsActivity{ 
    privateintrecLen = 0
    privateTextView txtView; 
  
    publicvoidonCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
  
        setContentView(R.layout.timertask); 
        txtView = (TextView)findViewById(R.id.txttime); 
           
        newThread(newMyThread()).start();         // start thread 
    }    
  
    finalHandler handler = newHandler(){          // handle 
        publicvoidhandleMessage(Message msg){ 
            switch(msg.what) { 
            case1
                recLen++; 
                txtView.setText(""+ recLen); 
            
            super.handleMessage(msg); 
        
    }; 
  
    publicclassMyThread implementsRunnable{      // thread 
        @Override 
        publicvoidrun(){ 
            while(true){ 
                try
                    Thread.sleep(1000);     // sleep 1000ms 
                    Message message = newMessage(); 
                    message.what = 1
                    handler.sendMessage(message); 
                }catch(Exception e) { 
                

方法五

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Handler与Runnable(最简单型) 
 
publicclasstimerTask extendsActivity{ 
    privateintrecLen = 0
    privateTextView txtView; 
  
    publicvoidonCreate(Bundle savedInstanceState){ 
        super.onCreate(savedInstanceState); 
  
        setContentView(R.layout.timertask); 
        txtView = (TextView)findViewById(R.id.txttime); 
           
        handler.postDelayed(runnable, 1000); 
    }    
  
    Handler handler = newHandler(); 
    Runnable runnable = newRunnable() { 
        @Override 
        publicvoidrun() { 
            recLen++; 
            txtView.setText(""+ recLen); 
            handler.postDelayed(this, 1000); 
        
    }; 
}

计时与倒计时 
方法1,方法2和方法3,都是倒计时 
方法4,方法5,都是计时 
计时和倒计时,都可使用上述方法实现(代码稍加改动) 

UI线程比较 
方法1,方法2和方法3,都是在UI线程实现的计时; 
方法4和方法5,是另开Runnable线程实现计时 

实现方式比较 
方法1,采用的是Java实现,即Timer和TimerTask方式; 
其它四种方法,都采用了Handler消息处理 

推荐使用 
如果对UI线程交互要求不很高,可以选择方法2和方法3 
如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理 
方法5,综合了前几种方法的优点,是最简的 

转载地址:http://www.open-open.com/lib/view/open1343782266665.html

0 0