Android之Looper+Thread+handler

前言:

         惶恐啊,惶恐!真不想发这篇文章,说实话,姐还没有深入解析Looper+thread+handler机制的能力呢!!于是,心虚的我贴出几位大牛的博客地址,以供大家学习。

http://blog.csdn.net/luoshengyang/article/details/6817933(老罗)

http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html(图文并茂)


       好了,我的博客写完了!!!!哈哈,开个玩笑,我就假装还有很多人期待我的罗嗦。

       异步线程的中心思想如下:

       1.创建一个子线程,并且让它从一开始就运行。

        2.获得子线程Looper。所谓的Looper相当与一个循环的消息队列,随时侯命处理各种任务。

        3.创建一个Handler,并且将子线程的Looper赋给它,告诉它,它需要把任务交付给子线程的消息队列。这样主线程就省力了,它把重货累活都交给子线程,自己只负责UI方面的东西。这样就不会出现卡机的状况了。

        4.最后,如果你再也不需要子线程了,千万别忘了mLooper.quit();

       嘿嘿,是不是很简单,这就上代码!

     HelloWorld.java

     public class HelloWorld extends Activity{

/*
     * 百度了一下Volatile,说Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。
     * 而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
     * 这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
     * */

    private volatile Looper mLooper;
    
    private volatile static MainHandler mMainHandler;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
       

        System.out.println("当前线程:++++++++ "+ Thread.currentThread().getId()); //打印出当前线程的ID

        HandlerThread mHandlerThread = new HandlerThread("child_thread");

        mHandlerThread.start();
        
        mLooper = mHandlerThread.getLooper();
        
        mMainHandler = new MainHandler(mLooper);

   }


      private final class MainHandler extends Handler {
           
         public MainHandler(Looper mLooper) {
                super(mLooper);
                
            }

            
         @Override
         public void handleMessage(Message msg) {

             System.out.println("当前线程:====== "+ Thread.currentThread().getId());

             switch (msg.what) {

              <干你想干的事情>

             }

        }

  }

                   

    @Override
    protected void onDestroy() {
        super.onDestroy();
       
        mLooper.quit(); //别忘了quit哦!

    }

    }

   

        以上就是使用Looper的基本思想。突然想起来,我还得稍微扩展一些内容,HandlerThread 是直接引用系统的,有时候我们可能会自己写一个子线程,那可能需要对子线程进行更多的处理。

       注意事项如下:

       1.要先Looper.prepare(),创建一个消息队列。

       2.才可以通过Looper.myLooper() 获得当前子线程的Looper。

       3.上面示例中有mLooper = mHandlerThread.getLooper() ,那么我们在自定义的线程中最好也有这样的方法,能让外部可以get到子线程的Looper。

       (1)声明一个Looper

        Looper mLooper;


       (2)获得当前的Looper()

          public void run() {

                Looper.prepare();

                mLooper = Looper.myLooper();

          <这里可以用Handler.....>

               Looper.loop();              

            }


      (3)创建getLooper方法以供外部使用。

           public Looper getLooper(){

              return mLooper;    

           }


      4.还有就是Looper.loop()使消息循环起作用,从消息队列里取消息,处理消息。

      5.最后嘛,别忘了quit一下。

    

       呼!我的理解就到这了,但对我来说,够用了。写的也不够详细,还有很多地方没有考虑到,两年后的我,要是变牛了,一定要来补充一下啊!

    

       


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值