android线程

线程知识点:

1、handler应该由处理消息的线程创建。

2、handler与创建它的线程相关联,而且也只与创建它的线程相关联。handler运行在创建它的线程中,所以,如果在handler中进行耗时的操作,会阻塞创建它的线程。如:

    MyHandler(looper)

3、Android的线程分为有消息循环的线程和没有消息循环的线程。有消息循环的线程一般都会有一个Looper。主线程(UI线程)就是一个消息循环的线程。

   Looper.myLooper();      //获得当前的Looper
   Looper.getMainLooper () //获得UI线程的Lopper

   Looper.prepare() //为当前该线程建立一个消息队列。调用 Looper.loop();之后就进入了消息循环,这个之后就可以发消息、取消息、和处理消息。

4、Handle的初始化函数(构造函数),如果没有参数,那么他就默认使用的是当前的Looper,如果有Looper参数,就是用对应的线程的Looper。

5、Handler.sendMessage(message); //往一个线程发送消息的函数,先初始化messsage,然后调用要发给的线程的handler来发送一个消息。

6. 一个Thead中可以绑定多个Hander(创建handler时,把线程的looper传进去),通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是每个线程中最多只有一个Looper,肯定也就一个MessageQuque。具体可以参考ConnectivityService.java

        HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");

        handlerThread.start();

        mHandler = new InternalHandler(handlerThread.getLooper());

        mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper());


Handler,Thread和Runnable三者间的关系:

  Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。
而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。创建线程可以以runbable为参数,也可以用

HandlerThread, 并且HandlerThread里已经初始化了looper。

下面这个例子以runnable为参数创建线程

class MyThread implements Runnable{ 
  private int ticket=10; 
  public void run(){ 
    for(int i=0;i<20;i++){ 
      if(this.ticket>0){ 
        System.out.println("卖票:ticket"+this.ticket--); 
      } 
    } 
} 

public class RunnableTicket { 
public static void main(String[] args) { 
MyThread mt=new MyThread(); 
new Thread(mt).start();  
} 
}; 

        mSenderThread = new HandlerThread("RILSender");
        mSenderThread.start();

        Looper looper = mSenderThread.getLooper();
        mSender = new RILSender(looper);
而    class RILSender extends Handler implements Runnable {
        public RILSender(Looper looper) {
            super(looper);  //handler的创建可以以looper为参数,这样handler就和线程的队列绑定了。
        }


        // Only allocated once
        byte[] dataLength = new byte[4];


        //***** Runnable implementation
        public void
        run() {
            //setup if needed
        }




        //***** Handler implementation
        @Override public void
        handleMessage(Message msg) {


handler的post方法也可运行runnable。用handler的post方法,把Runnable对象(一般是Runnable的子类)传过去;handler会在looper中调用这个Runnable的Run方法

  Handler mHandler=new Handler(); 
     mHandler.post(new Runnable(){ 
        @Override public void run() 
        { // TODO Auto-generated method stub 
         } 
     });

Message obtainMessage (int what, int arg1, int arg2, Object obj)//可以把当前线程的handler赋值给obj,来传递到另一个线程,以便两者互相通信
Message msg = handler.obtainMessage(); //这里的handler应该是目的handler,会把这个handler保存在返回的msg的成员变量里边

Message.sendToTarget 函数就可以发送一个消息到msg里保存的handler去

http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html  :轻量级的异步线程,作者写得挺清楚的。





<p></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiqingyang2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值