关于Looper的使用

 我们知道,在android的线程里,是从message loop取出信息来处理的,主线程和子线程、子线程和子线程之间的通讯也是Looper来实现的,接下来我就简单介绍下Looper的使用方法。
 主线程(即UI线程)自身就有message loop,不需要创建,而其他线程就需要手动创建,使用prepare()创建loop,使用 loop()来启动loop,直到loop停止。

方法介绍:
返回应用主线程的looper

返回当前线程

loop()
在线程里运行信息队列(message queue)

myLooper()
返回当前线程的looper

返回当前线程的messageQueue对象

初始化当前线程的Looper

初始化应用主线程的Looper

quit()
退出Looper

1.主线程向子线程发信息:
首先创建一个子线程,在子线程中创建Looper并且运行,接收主线程向子线程发送的信息,并且处理。
    ChildrenLooperThread childerLooperThread=new ChildrenLooperThread();
    childerLooperThread.start();

    public class ChildrenLooperThread extends Thread{
         @Override
         public void run() {
              Looper.prepare();//创建Looper
              mHandler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                         // TODO Auto-generated method stub
                         Log.e("TAG", "mHandler");
                         Log.e("TAG", msg.obj.toString());//接收主线程向子线程发送的信息,并且处理。
                         super.handleMessage(msg);
                    }
              };
              Looper.loop();//运行
              super.run();
         }
    }

在主线程中向子线程发送信息
     Message msg=mHandler.obtainMessage();
     msg.obj="主线程向子线程传递数据";
     mHandler.sendMessage(msg);

2.子线程向主线程发送信息
首先创建子线程,通过主线程的handler发送信息,在主线程创建的handler的handlerMessage中处理主线程发送信息。
      MainLooperThread mainLooperThread=new MainLooperThread();
      mainLooperThread.start();

    public class MainLooperThread extends Thread{
          @Override
          public void run() {
               Message msg=mainHandler.obtainMessage();
               msg.obj="子线程向主线程传递数据";
               mainHandler.sendMessage(msg);
               super.run();
          }
    }

        mainHandler=new Handler(Looper.getMainLooper()){//通过主线程的Loope创建handler
               @Override
               public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    Log.e("TAG", "mainHandler");
                    Log.e("TAG", "handleMessage");
                    Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    super.handleMessage(msg);
               }
        };

这样就可以在任意的2个线程间进行通讯。

    有积分链接:http://download.csdn.net/detail/jhg19900321/4561747

    无积分链接:https://code.google.com/p/my-csdn-resource/

       注:我觉得分享应该是免费的,之所以有有积分的链接,就是为了如果有朋友积分很多,那就选择有积分链接,给我些积分,让我可以下载别人的源码,如果朋友没有积分,那就可以选择无积分的链接,谢谢!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值