Thread、Handler与HandlerThread、Handler使用

来源:互联网 发布:cf淘宝特卖 编辑:程序博客网 时间:2024/03/29 01:53


原文出处:http://oma1989.iteye.com/blog/1991880


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
原创粉丝点击