Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 好玩的Handler,好玩Handler

好玩的Handler,好玩Handler

編輯:關於android開發

好玩的Handler,好玩Handler


 
  • 先來看一個簡單的消息吧
    1. privateProgressBar mProgressBar;
    2. privateint i =0;
    3. privateHandler mHandler =newHandler(){ // 創建Handle
    4. @Override
    5. publicvoid handleMessage(Message msg){
    6. super.handleMessage(msg);
    7. Log.i("-mHandler->",i+"");
    8. mProgressBar.setProgress(i);
    9. }
    10. };
    11. privateRunnable runnable =newRunnable(){
    12. @Override
    13. publicvoid run(){
    14. Log.i("-Runnable->",i+"");
    15. i +=10;
    16. // 要做的事情,這裡再次調用此Runnable對象,以實現每兩秒實現一次的定時器操作
    17. mHandler.postDelayed(runnable,2000); // 定時器
    18. mHandler.sendMessageDelayed(Message.obtain(),0);// 發送消息才會觸發重寫的handleMessage方法
    19. }
    20. };
    21. @Override
    22. protectedvoid onCreate(@NullableBundle savedInstanceState){
    23. super.onCreate(savedInstanceState);
    24. setContentView(R.layout.activity_handler);
    25. mProgressBar =(ProgressBar) findViewById(R.id.pb_handler);
    26. mHandler.post(runnable);// 開始執行線程
    27. // runnable.run(); // 也可以用這個來開始線程
    28. }
    29. /**
    30. * 刪除的時候停止線程操作
    31. */
    32. @Override
    33. protectedvoid onDestroy(){
    34. super.onDestroy();
    35. mHandler.removeCallbacks(runnable);
    36. }
    37. }
     
  • 獲取Message的兩種方法
    1. // 兩種獲取Message的方法 
    2. // Returns a new Message from the global message pool.
    3. mHandler.obtainMessage()和Message.obtain()
    1. // 兩種方法其實是一樣的,只不過一個是通過Handler獲取,一個是通過Message的靜態方法獲得,查詢Handler的源碼會發現,obtainMessage的方法構成:
    2. publicfinalMessage obtainMessage()
    3. {
    4. returnMessage.obtain(this);
    5. }
  • 通過查詢源碼後發現,Message提供了諸如以下的變量
    1. Message的recycleUnchecked()方法
    2. void recycleUnchecked(){
    3. // Mark the message as in use while it remains in the recycled object pool.
    4. // Clear out all other details.
    5. flags = FLAG_IN_USE; //int
    6. what =0; // int
    7. arg1 =0; // int
    8. arg2 =0; // int
    9. obj =null; // Object
    10. replyTo =null; // Messenger 信使,信差
    11. sendingUid =-1;
    12. when =0; // long
    13. target =null; // Handler
    14. callback =null; // Runable
    15. data =null; // Bundle
    16. synchronized(sPoolSync){
    17. if(sPoolSize < MAX_POOL_SIZE){
    18. next = sPool;
    19. sPool =this;
    20. sPoolSize++;
    21. }
    22. }
    23. }
    使用系統變量的好處是可以大大減少系統的消耗;所以更新進度條的代碼應修改為
    1. mProgressBar.setProgress(msg.arg1);
    1. privateRunnable runnable =newRunnable(){
    2. @Override
    3. publicvoid run(){
    4. Log.i("-Runnable->", i +"");
    5. i +=3;
    6. // 要做的事情,這裡再次調用此Runnable對象,以實現每兩秒實現一次的定時器操作
    7. mHandler.postDelayed(runnable,300);
    8. Message msg = mHandler.obtainMessage();
    9. msg.arg1 +=i;
    10. mHandler.sendMessage(msg);// 發送消息才會觸發重寫的handleMessage方法
    11. // mHandler.sendMessageDelayed(Message.obtain(),0); // 發送消息才會觸發重寫的handleMessage方法
    12. }
    13. };
     
  • 重新優化下Handler
    1. privateHandler mHandler =newHandler(){
    2. @Override
    3. publicvoid handleMessage(Message msg){
    4. super.handleMessage(msg);
    5. //Log.i("-mHandler->", i + "");
    6. if(msg.arg1 >100){
    7. mHandler.removeCallbacks(runnable);
    8. }else{
    9. mProgressBar.setProgress(msg.arg1);
    10. }
    11. }
    12. };
     


  • 來自為知筆記(Wiz)



    1. 上一頁:
    2. 下一頁:
    熱門文章
    閱讀排行版
    Copyright © Android教程網 All Rights Reserved