如何用cpp实现 mWorkHandler.post(new Runnable()
时间: 2024-03-03 09:53:38 浏览: 162
实现Runnable接口创建多线程.docx
在 Android 中,mWorkHandler.post(new Runnable()) 方法是将一个 Runnable 对象 post 到 mWorkHandler 所在的线程的消息队列中,等待被处理。这个过程可以通过 C++11 中的 std::function 和 std::thread 来实现。
具体实现步骤如下:
1. 定义一个 Runnable 对象:
```cpp
class Runnable {
public:
virtual void run() = 0;
};
```
2. 在 mWorkHandler 所在的线程中,创建一个 std::thread 对象来处理消息:
```cpp
// 定义消息处理函数
void handleMessage(const sp<Message>& message) {
switch (message->what) {
case MSG_POST_RUNNABLE:
// 获取 Runnable 对象
sp<Runnable> runnable = message->obj.get<Runnable>();
// 执行 Runnable
runnable->run();
break;
default:
break;
}
}
// 在 mWorkHandler 所在的线程中创建一个 std::thread 对象
std::thread thread([this]() {
while (true) {
// 从消息队列中取出消息
sp<Message> message = mMessageQueue->dequeueMessage();
// 处理消息
handleMessage(message);
}
});
```
3. 在 mWorkHandler 中,实现 post() 方法,将 Runnable 对象 post 到消息队列中:
```cpp
class Handler {
public:
void post(const sp<Runnable>& runnable) {
// 创建消息
sp<Message> message = new Message();
message->what = MSG_POST_RUNNABLE;
message->obj = runnable;
// 将消息 post 到消息队列中
mMessageQueue->enqueueMessage(message);
}
private:
sp<MessageQueue> mMessageQueue;
};
// 定义消息类型
enum {
MSG_POST_RUNNABLE = 1,
};
class Message {
public:
int what;
sp<RefBase> obj;
};
class MessageQueue {
public:
void enqueueMessage(const sp<Message>& message) {
// 将消息加入队列中
...
}
sp<Message> dequeueMessage() {
// 从队列中获取消息
...
return message;
}
};
```
这样就可以用 C++11 中的 std::function 和 std::thread 来实现类似于 mWorkHandler.post(new Runnable()) 的功能了。需要注意的是,实际应用中还需要考虑线程安全等问题。
阅读全文