1. Android Handler回顾
在Android中,UI线程是一个很重要的概念。我们在日常开发中对UI的更新和一些系统行为,都必须在UI线程(主线程)中进行调用。我们在子线程更新UI时最常用的手段就是Handler,Handler的主要原理:
主要是有一个Looper不停的从队列读消息,子线程通过持有Handler向队列写消息,以此来实现线程通信。但让Looper线程不一定是主线程,子线程也可以通过Looper.prepare();
来创建Looper,构建Handler时可以将Looper传入到Handler构造方法来和Looper绑定。
2. JNI中实现Looper
理论上我们日常开发中不会涉及JNI中更新UI的问题,就算需要也可以回调到Java层,在Java层切换。但是当我们遇到很多线程需要回调JNI,而JNI线程回调Java需要通过JavaVM来创建JNIEnv,每个线程都来AttachCurrentThread会带来性能上的开销,我们会想都通过一个线程回调Java来解决这个问题,这个时候是不是就开始怀念Java的Handler了?
我们可以手动实现一个队列来实现一个线程回调Java:
template <typename T>
class BlockingQueue
{
public:
BlockingQueue()
:m_mutex(),
m_condition(),