Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • Handler与Thread

    post by onelong / 2010-8-30 4:41 Monday [android]

    android里面对于异步消息的处理,提供了一套Handler的实现方案。Handler有很多适宜的应用和微妙之处,使它在和Thread以及Service等一起使用的时候达到很好的效果。

    Handler与Thread的区别。Handler与调用者处于同一线程,如果Handler里面做耗时的动作,调用者线程会阻塞。Android UI操作不是线程安全的,并且这些操作必须在UI线程中执行。Android提供了几种基本的可以在其他线程中处理UI操作的方案,包括Activity的runOnUiThread(Runnable),View的post以及1.5版本的工具类AsyncTask等方案都采用了Handler,Handler的post对线程的处理也不是真正start一个新的线程,而是直接调用了线程的run方法

    Handler对于Message的处理不是并发的。一个Looper 只有处理完一条Message才会读取下一条,所以消息的处理是阻塞形式的。但是如果用不同的Looper则能达到并发的目的。Service中,onStart的执行也是阻塞的。如果一个startService在onStart执行完成之前,再次条用startService也会阻塞。如果希望能尽快的执行onStart则可以在onStart中使用handler,因为Message的send是非阻塞的。如果要是不同消息的处理也是并发的,则可以用不同的Looper实例化Handler。
    向Handler对象发送类似new Message ()形式的空Message可以达到清空Message的目的,这种做法与getLooper().quit()的做法是一样的。如果利用的资源较多,应及时清理

    演示例子:

    package com.hl;

    import java.util.Timer;
    import java.util.TimerTask;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;

    public class MHandler extends Activity {
        private TextView tv,tm;
        private Handler h;
        private static int num=0;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
           
            tv=(TextView)findViewById(R.id.tv);
            tm=(TextView)findViewById(R.id.tm);
            Button thread1=(Button)findViewById(R.id.bt1);
            Button thread2=(Button)findViewById(R.id.bt2);
            Button thread3=(Button)findViewById(R.id.bt3);
            final Button thread4=(Button)findViewById(R.id.bt4);
     
            h = new Handler() {  
                public void handleMessage(Message msg) {
                 switch(msg.what){
                  case 1:
                   tv.setText((String)msg.obj+"我的线程1");
                   break;
                 case 2:
                  tv.setText((String)msg.obj+"我的线程2");
                         break;
                 case 3:
                  tv.setText((String)msg.obj+"我的线程3");
                         break;
                 case 4:
                  tm.setText(msg.obj.toString());
                         break;
                     } 
                 }  
             };
             
             thread1.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
         new Thread() {
                public void run() { 
                 Message msg = h.obtainMessage(1, 1, 1, "你好!");  
                 h.sendMessage(msg);
                   }
               }.start();
         
        }
       });
             thread2.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
         new Thread(new Runnable(){

          @Override
          public void run() {
           Message msg = h.obtainMessage(2, 1, 1, "你好!");  
                 h.sendMessage(msg);
          }}).start();
         
        }
       });
             thread3.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
         h.post(new Runnable() {
          @Override
          public void run() {
           Message msg = h.obtainMessage(3, 1, 1, "你好!");  
                 h.sendMessage(msg);
          }
         });
        }
       });
             
             thread4.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View v) {
         Timer timer = new Timer();
         thread4.setEnabled(false);
         timer.schedule(new TimerTask() {
          
          @Override
          public void run() {
           Message message = new Message();
           if(num<2000)
            num++;
           else
            num=0;
           message.what=4;
           message.obj=num;
           h.sendMessage(message); 
          }
         }, 1, 1000);
        }
       });
        }

    }

    引用地址:
     

    评论:

    1. louldergoli
      Good day!  
      Happy New Year!
      Health, luck and love!

    我要评论