免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 825 | 回复: 0

android 的handler 机制 [复制链接]

论坛徽章:
0
发表于 2011-12-23 03:03 |显示全部楼层

Andriod提供了Handler和Looper来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange).
  1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). : ]: J! s2 o  Q) [* ]& U. U
  2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息. 3 r7 f- P& i* ]4 D8 w3 |8 ]+ v% h
    3) Message Queue(消息队列):用来存放线程放入的消息.
  4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue.


在android中,用户自己创建的工作线程和UI主线程是不同的线程。handler 是android中一种消息的异步处理机制。在用户未给自己的工作线程创建Looper,即默认情况下,handler 会在主线程的Looper下进行消息处理,这时handler占用主线程。

   当用户在启动自己的工作线程时调用Looper.prepare(),这时创建了自己的Looper,当我们利用handler进行消息处理时,自己的工作线程将和主线程不是同一个线程。代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Demo1 extends Activity{
      
    private Button button1,button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        button1=(Button)findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                MyThread myThread=new MyThread();
                myThread.start();
                Log.i("main Thread UI id:",Thread.currentThread().getId()+"");
            }
        });
    }
    
    
    class MyHandler extends Handler {
        
        public MyHandler(Looper looper){
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            Log.i("handler thread id:",Thread.currentThread().getId()+"");    
        }    
    }
       
    class MyThread extends Thread {
         private MyHandler myHandler;
         private  String obj;
        public void run(){
              Looper myLopper ;
              Looper.prepare();
              myLopper=Looper.myLooper();
              myHandler=new MyHandler(myLopper);
               Log.i("my thread id:",""+Thread.currentThread().getId());
               obj="my thread";    
               myHandler.removeMessages(0);
              Message message=myHandler.obtainMessage(1,1,1,obj);
              myHandler.sendMessage(message);
              Looper.loop();
            
        }
        
    }
     
}

运行结果如下:

I/main Thread UI id:(  725): 1
I/my thread id:(  725): 8
I/handler thread id:(  725): 8

由此可见,当我们创建自己的Looper时,系统的handler将占用用户的工作线程。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP