日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android中定時(shí)器Timer和TimerTask的啟動,停止,暫停,繼續(xù)等操作實(shí)例

 旭龍 2012-09-18

Android中定時(shí)器Timer和TimerTask的啟動,停止,暫停,繼續(xù)等操作實(shí)例

分類: Android 3780人閱讀 評論(1) 收藏 舉報(bào)

下面是一個在Android中使用定時(shí)器Timer和TimerTask的啟動,停止,暫停,繼續(xù)等操作的demo。

需要注意的問題主要有兩點(diǎn):

1、Timer和TimerTask在調(diào)用cancel()取消后不能再執(zhí)行 schedule語句,否則提示出錯,提示如下:

  1. D/AndroidRuntime( 6672): Shutting down VM  
  2. W/dalvikvm( 6672): threadid=1: thread exiting with uncaught exception (group=0x40018560)  
  3. E/AndroidRuntime( 6672): FATAL EXCEPTION: main  
  4. E/AndroidRuntime( 6672): java.lang.IllegalStateException: Timer was canceled  
  5. E/AndroidRuntime( 6672):    at java.util.Timer.scheduleImpl(Timer.java:563)  
  6. E/AndroidRuntime( 6672):    at java.util.Timer.schedule(Timer.java:483)  
  7. E/AndroidRuntime( 6672):    at com.snowdream.timerdemo.TimerDemoActivity$2.onClick(TimerDemoActivity.java:73)  
  8. E/AndroidRuntime( 6672):    at android.view.View.performClick(View.java:2501)  
  9. E/AndroidRuntime( 6672):    at android.view.View$PerformClick.run(View.java:9107)  
  10. E/AndroidRuntime( 6672):    at android.os.Handler.handleCallback(Handler.java:587)  
  11. E/AndroidRuntime( 6672):    at android.os.Handler.dispatchMessage(Handler.java:92)  
  12. E/AndroidRuntime( 6672):    at android.os.Looper.loop(Looper.java:130)  
  13. E/AndroidRuntime( 6672):    at android.app.ActivityThread.main(ActivityThread.java:3835)  
  14. E/AndroidRuntime( 6672):    at java.lang.reflect.Method.invokeNative(Native Method)  
  15. E/AndroidRuntime( 6672):    at java.lang.reflect.Method.invoke(Method.java:507)  
  16. E/AndroidRuntime( 6672):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)  
  17. E/AndroidRuntime( 6672):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)  
  18. E/AndroidRuntime( 6672):    at dalvik.system.NativeStart.main(Native Method)  
  19. W/ActivityManager(  154):   Force finishing activity com.snowdream.timerdemo/.TimerDemoActivity  
  20. W/ActivityManager(  154): Activity pause timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}  
  21. W/ActivityManager(  154): Activity destroy timeout for HistoryRecord{40550560 com.snowdream.timerdemo/.TimerDemoActivity}  
  22. D/dalvikvm(  800): GC_EXPLICIT freed 13K, 58% free 3127K/7431K, external 0K/0K, paused 70ms  
  23. D/dalvikvm(  562): GC_EXPLICIT freed 59K, 51% free 2935K/5959K, external 245K/512K, paused 84ms  
  24. I/ActivityManager(  154): Start proc com.android.email for service com.android.email/.service.MailService: pid=6691 uid=10019 gids={30031015}  

2、只能在UI主線程中更新控件/組件。在其他線程中,更新控件/組件,會提示出錯,提示如下:

(注:這種情況下,可以通過Hander發(fā)送消息的方式來更新控件/組件,詳情參考例子。)

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


Demo源碼如下:

TimerDemoActivity.java

  1. package com.snowdream.timerdemo;  
  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.util.Log;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.TextView;  
  14.   
  15. public class TimerDemoActivity extends Activity {  
  16.   
  17.     private static String  TAG = "TimerDemo";  
  18.   
  19.     private TextView mTextView = null;  
  20.     private Button mButton_start = null;  
  21.     private Button mButton_pause = null;  
  22.   
  23.     private Timer mTimer = null;  
  24.     private TimerTask mTimerTask = null;  
  25.   
  26.     private Handler mHandler = null;  
  27.       
  28.     private static int count = 0;  
  29.     private boolean isPause = false;  
  30.     private boolean isStop = true;  
  31.   
  32.     private static int delay = 1000;  //1s  
  33.     private static int period = 1000;  //1s  
  34.   
  35.     private static final int UPDATE_TEXTVIEW = 0;  
  36.       
  37.     @Override  
  38.     public void onCreate(Bundle savedInstanceState) {  
  39.         super.onCreate(savedInstanceState);  
  40.         setContentView(R.layout.main);  
  41.   
  42.         mTextView = (TextView)findViewById(R.id.mytextview);   
  43.         mButton_start = (Button)findViewById(R.id.mybutton_start);  
  44.         mButton_pause = (Button)findViewById(R.id.mybutton_pause);  
  45.   
  46.   
  47.         mButton_start.setOnClickListener(new Button.OnClickListener() {  
  48.             public void onClick(View v) {  
  49.                 if (isStop) {  
  50.                     Log.i(TAG, "Start");  
  51.                 } else {  
  52.                     Log.i(TAG, "Stop");  
  53.                 }  
  54.   
  55.                 isStop = !isStop;  
  56.   
  57.                 if (!isStop) {  
  58.                     startTimer();  
  59.                 }else {  
  60.                     stopTimer();  
  61.                 }  
  62.   
  63.                 if (isStop) {  
  64.                     mButton_start.setText(R.string.start);  
  65.                 } else {  
  66.                     mButton_start.setText(R.string.stop);  
  67.                 }  
  68.             }  
  69.         });  
  70.   
  71.         mButton_pause.setOnClickListener(new Button.OnClickListener() {  
  72.             public void onClick(View v) {  
  73.                 if (isPause) {  
  74.                     Log.i(TAG, "Resume");  
  75.                 } else {  
  76.                     Log.i(TAG, "Pause");  
  77.                 }  
  78.   
  79.                 isPause = !isPause;  
  80.   
  81.                 if (isPause) {  
  82.                     mButton_pause.setText(R.string.resume);  
  83.                 } else {  
  84.                     mButton_pause.setText(R.string.pause);  
  85.                 }  
  86.             }  
  87.         });  
  88.           
  89.         mHandler = new Handler(){  
  90.   
  91.             @Override  
  92.             public void handleMessage(Message msg) {  
  93.                 switch (msg.what) {  
  94.                 case UPDATE_TEXTVIEW:  
  95.                     updateTextView();  
  96.                     break;  
  97.                 default:  
  98.                     break;  
  99.                 }  
  100.             }  
  101.         };  
  102.     }  
  103.   
  104.     private void updateTextView(){  
  105.         mTextView.setText(String.valueOf(count));  
  106.     }  
  107.   
  108.     private void startTimer(){  
  109.         if (mTimer == null) {  
  110.             mTimer = new Timer();  
  111.         }  
  112.   
  113.         if (mTimerTask == null) {  
  114.             mTimerTask = new TimerTask() {  
  115.                 @Override  
  116.                 public void run() {  
  117.                     Log.i(TAG, "count: "+String.valueOf(count));  
  118.                     sendMessage(UPDATE_TEXTVIEW);  
  119.                       
  120.                     do {  
  121.                         try {  
  122.                             Log.i(TAG, "sleep(1000)...");  
  123.                             Thread.sleep(1000);  
  124.                         } catch (InterruptedException e) {  
  125.                         }     
  126.                     } while (isPause);  
  127.                       
  128.                     count ++;    
  129.                 }  
  130.             };  
  131.         }  
  132.   
  133.         if(mTimer != null && mTimerTask != null )  
  134.             mTimer.schedule(mTimerTask, delay, period);  
  135.   
  136.     }  
  137.   
  138.     private void stopTimer(){  
  139.           
  140.         if (mTimer != null) {  
  141.             mTimer.cancel();  
  142.             mTimer = null;  
  143.         }  
  144.   
  145.         if (mTimerTask != null) {  
  146.             mTimerTask.cancel();  
  147.             mTimerTask = null;  
  148.         }     
  149.   
  150.         count = 0;  
  151.   
  152.     }  
  153.       
  154.     public void sendMessage(int id){  
  155.         if (mHandler != null) {  
  156.             Message message = Message.obtain(mHandler, id);     
  157.             mHandler.sendMessage(message);   
  158.         }  
  159.     }  
  160. }  



layout-main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas./apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/mytextview"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:gravity="center"  
  12.         android:text="@string/number" />  
  13.   
  14.     <LinearLayout  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:gravity="center"  
  18.         android:orientation="horizontal" >  
  19.   
  20.         <Button  
  21.             android:id="@+id/mybutton_start"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="@string/start" />  
  25.   
  26.         <Button  
  27.             android:id="@+id/mybutton_pause"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content"  
  30.             android:text="@string/pause" />  
  31.     </LinearLayout>  
  32.   
  33. </LinearLayout>  



strings.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <string name="app_name">TimerDemo</string>  
  5.     <string name="number">0</string>  
  6.     <string name="start">start</string>  
  7.     <string name="stop">stop</string>  
  8.     <string name="pause">pause</string>  
  9.     <string name="resume">resume</string>  
  10.   
  11. </resources>  


源碼下載:

http://download.csdn.net/detail/yang_hui1986527/3922447

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多