Android---多线程的处理

多线程编程在各种编程语言中,对我来说都是难点,不容易掌握,关于Android中的多线程编程,通过书籍和网络,简单的总结一下。

在进行UI更新、耗时操作、游戏开发等需要多线程。Android中多线程编程,主要涉及到三个类:Looper、Handler和Message。依次简单的介绍一下。

Looper类用来创建消息队列. 每个线程最多只能有一个消息队列, android中UI线程默认具有消息队列, 但非UI线程在默认情况下是不具备消息队列的. 如果需要在非UI线程中开启消息队列, 需要调用Looper.prepare()方法, 在该方法的执行过程中会创建一个Looper对象, 而Looper的构造函数中会创建一个MessageQueue instance(Looper的构造函数是私有的, 在Looper类之外无法创建其对象). 此后再为该线程绑定一个Handler instance, 然后调用Looper.loop()方法, 就可以不断的从消息队列中取出消息和处理消息了. Looper.myLoop()方法可以得到线程的Looper对象, 如果为null, 说明此时该线程尚未开启消息队列.

Handler类用于处理消息. 该类具有四个构造函数:
1. public Handler(). 创建好的Handler instance将绑定在代码所在的线程的消息队列上, 因此一定要确定该线程开启了消息队列, 否则程序将发生错误. 使用这个构造函数创建Handler instance, 一般来说, 我们需要重写Hanler类的handleMessage()方法, 以便在之后的消息处理时调用.
2. public Handler(Callback callback). Callback是Handler内部定义的一个接口, 因此想要使用这个构造函数创建Handler对象, 需要自定义一个类实现Callback接口, 并重写接口中定义的handleMessage()方法. 这个构造函数其实与无参的构造函数类似, 也要确保代码所在的线程开启了消息队列. 不同的是在之后处理消息时, 将调用callback的handleMessage()方法, 而不是Handler对象的handleMssage()方法.
3. public Handler(Looper looper). 这个构造函数表示创建一个Handler instance, 并将其绑定在looper所在的线程上. 此时looper不能为null. 此时一般也需要重写Hanler类的handleMessage()方法
4. public Handler(Looper looper, Callback callback).
Message类用于表示消息. Message对象可以通过arg1, arg2, obj字段和setData()携带数据, 此外还具有很多字段. when字段决定Message应该何时出对处理, target字段用来表示将由哪个Handler对象处理这个消息, next字段表示在消息队列中排在这个Message之后的下一个Message, callback字段如果不为null表示这个Message包装了一个runnable对象, what字段表示code, 即这个消息具体是什么类型的消息. 每个what都在其handler的namespace中, 只需要确保将由同一个handler处理的消息的what属性不重复就可以.
还有一个很关键的概念,MessageQueue,既消息队列,由消息中的when字段决定消息的排序顺序。
多线程之间的通信,就是通过这几个关键的类进行处理,一个Handler关联到一个线程(假设为A)上的一个消息队列,那么另一个线程(假设为B)就可以调用Handler中的方法,向A中的消息队列压入一个Message,这个Message就可以在线程A中得到处理。

你可能感兴趣的:(android)