关于Looper的使用

来源:互联网 发布:怎么安装软件 编辑:程序博客网 时间:2024/05/16 01:01
 我们知道,在android的线程里,是从message loop取出信息来处理的,主线程和子线程、子线程和子线程之间的通讯也是Looper来实现的,接下来我就简单介绍下Looper的使用方法。
 主线程(即UI线程)自身就有message loop,不需要创建,而其他线程就需要手动创建,使用prepare()创建loop,使用 loop()来启动loop,直到loop停止。

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

getThread()
返回当前线程

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

myLooper()
返回当前线程的looper

myQueue()
返回当前线程的messageQueue对象

prepare()
初始化当前线程的Looper

prepareMainLooper()
初始化应用主线程的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/

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




原创粉丝点击