Thread、Handler与HandlerThread、Handler使用

来源:互联网 发布:尘埃4还是拉力知乎 编辑:程序博客网 时间:2024/04/20 13:38

Handler会关联一个单独的线程和消息队列。Handler默认关联主线程,虽然要提供Runnable参数,但默认是直接调用Runnable中的run()方法。也就是默认下会在主线程执行,如果在这里面的操作会有阻塞,界面也会卡住。如果要在其他线程执行,可以使用HandlerThread

HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,主要的作用是建立了一个线程,并且创立了消息队列,有来自己的looper,可以让我们在自己的线程中分发和处理消息。

 

Thread、handler代码  收藏代码
  1. <span style="font-size: 12px;">package com.goma.handlertwo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.os.Message;  
  6. import android.app.Activity;  
  7. import android.view.Menu;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.ProgressBar;  
  11.   
  12. public class HandlerActivity extends Activity {  
  13.     private Handler handler = null;  
  14.     private ProgressBar progressBar = null;  
  15.     private int i = 0;  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_handler);  
  20.           
  21.         progressBar = (ProgressBar)findViewById(R.id.pb_id);  
  22.         Button start = (Button)findViewById(R.id.start);  
  23.         Button stop = (Button)findViewById(R.id.stop);  
  24.           
  25.         System.out.println("HandlerActivity:::::"+Thread.currentThread().getId());  
  26.           
  27.         handler = new Handler(new Handler.Callback() {  
  28.             @Override  
  29.             public boolean handleMessage(Message msg) {  
  30.                 // TODO Auto-generated method stub  
  31.                 System.out.println("Handler.CallBack::::" + Thread.currentThread().getId());  
  32.                 progressBar.setProgress(msg.arg1);  
  33.                 progressBar.setSecondaryProgress(msg.arg1 + 5 );  
  34.                 return false;  
  35.             }  
  36.         });  
  37.           
  38.         start.setOnClickListener(new View.OnClickListener() {  
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 handler.post(run);  
  43.             }  
  44.         });  
  45.           
  46.         stop.setOnClickListener(new View.OnClickListener() {  
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 // TODO Auto-generated method stub  
  50.                 handler.removeCallbacks(run);  
  51.             }  
  52.         });  
  53.     }  
  54.   
  55.     @Override  
  56.     public boolean onCreateOptionsMenu(Menu menu) {  
  57.         // Inflate the menu; this adds items to the action bar if it is present.  
  58.         getMenuInflater().inflate(R.menu.handler, menu);  
  59.         return true;  
  60.     }  
  61.       
  62.     Runnable run = new Runnable() {  
  63.         @Override  
  64.         public void run() {  
  65.             // TODO Auto-generated method stub  
  66.             System.out.println("##########"+Thread.currentThread().getId());  
  67.             handler.postDelayed(run, 2000);  
  68.             Message msg = handler.obtainMessage();  
  69.             msg.arg1 = i * 10 ;  
  70.             i++;  
  71.             handler.sendMessage(msg);  
  72.         }  
  73.     };  
  74. }  
  75. </span>  

    上面代码System.out输出线程ID相同

 

Handlerthread、handler代码  收藏代码
  1. <span style="font-size: 12px;">package com.goma.handlerthreaddemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.HandlerThread;  
  7. import android.os.Message;  
  8. import android.view.Menu;  
  9. import android.view.View;  
  10. import android.widget.Button;  
  11.   
  12. public class HandlerThreadActivity extends Activity {  
  13.     Handler handler = null;  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_handler_thread);  
  19.   
  20.         System.out.println("------------------>" + Thread.currentThread().getId());  
  21.   
  22.         HandlerThread ht = new HandlerThread("MyThread");  
  23.         ht.start();  
  24.         handler = new Handler(ht.getLooper(), new Handler.Callback() {  
  25.             @Override  
  26.             public boolean handleMessage(Message msg) {  
  27.                 // TODO Auto-generated method stub  
  28.                 int tmp = msg.arg1;  
  29.                 System.out.println(Thread.currentThread().getId() + "::::::::::::" + tmp);  
  30.                 return false;  
  31.             }  
  32.         });  
  33.   
  34.         Button btn = (Button) findViewById(R.id.btn);  
  35.         btn.setOnClickListener(new View.OnClickListener() {  
  36.   
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 // TODO Auto-generated method stub  
  40.                 handler.post(run);  
  41.             }  
  42.         });  
  43.   
  44.         Button btn2 = (Button) findViewById(R.id.btn2);  
  45.         btn2.setOnClickListener(new View.OnClickListener() {  
  46.   
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 // TODO Auto-generated method stub  
  50.                 handler.removeCallbacks(run);  
  51.             }  
  52.         });  
  53.     }  
  54.   
  55.     @Override  
  56.     public boolean onCreateOptionsMenu(Menu menu) {  
  57.         // Inflate the menu; this adds items to the action bar if it is present.  
  58.         getMenuInflater().inflate(R.menu.handler_thread, menu);  
  59.         return true;  
  60.     }  
  61.   
  62.     Runnable run = new Runnable() {  
  63.   
  64.         @Override  
  65.         public void run() {  
  66.             // TODO Auto-generated method stub  
  67.             handler.postDelayed(run, 5000);  
  68.             Message msg = handler.obtainMessage();  
  69.             msg.arg1 = 1123;  
  70.             handler.sendMessage(msg);  
  71.             System.out.println("###################" + Thread.currentThread().getId());  
  72.         }  
  73.     };  
  74. }</span>  

    从上面代码看线程ID是不同的,有两个一个主线程、一个HandlerThread线程

 

    ==========================================================

    另:我在学习HandlerThread、Thread时,我就向为什么不:

    Thread t = new Thread(Runnable);

    t.start();

    后来弄明白了,其实Runnable是在Handler执行的,但是Handler默认绑定主线程,

    所以采用这种方法,在Thread.start()确是新生成一个线程,但是在Handler.post(Runnable)后,

    runnable方法又会被绑定到主线程中执行。

    ==========================================================================

 

    另可参考:http://blog.sina.com.cn/s/blog_5da93c8f0101kio1.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肠功能蠕动慢便秘怎么办 胃肠型和蠕动波怎么办 胃不蠕动了怎么办偏方 喂母乳母亲奶头裂开怎么办 给宝宝吃奶被吃到奶头裂开怎么办 宝宝吃奶奶头裂开了怎么办 小孩吃奶奶头裂开了怎么办 站久坐久腰酸痛怎么办 孕39周胎儿头小怎么办 怀孕腰两侧长肉怎么办 怀孕四个月半月吃点就饱怎么办啊 怀孕四个月睡眠不好怎么办 二胎七个月肚子太大怎么办 上火牙疼牙龈肿怎么办 孕30周乳房胀痛怎么办 怀孕长妊娠纹了怎么办 坐久了肚子胀疼怎么办 怀孕后胖的太快怎么办 怀孕牙齿全坏了怎么办 怀孕脸胖了好多怎么办 孕晚期不爱吃肉怎么办 怀孕期间胖了怎么办啊 孕期长得太胖怎么办 狗吃马肉脸肿了怎么办 狗过敏了脸肿了怎么办 孕初期外阴很痒怎么办 怀孕了吃了田鸡怎么办 孕妇睡眠质量差怎么办吃什么 39周2天了还不生怎么办 孕中期体重猛长怎么办 4个半月胎位不正怎么办 41周不产生宫缩怎么办 生完孩子胎盘没有脱落怎么办 39周还是臀位怎么办 怀孕7个月胎位不正怎么办 怀孕六个多月胎位不正怎么办 怀孕七个月了胎位不正怎么办 怀孕七个月胎位不正怎么办 怀孕肚子上有妊娠纹怎么办 怀孕九个月肚子长痱子怎么办 怀孕前体重偏胖怎么办