parent
bf64d66d05
commit
5d6755466d
@ -0,0 +1,69 @@ |
|||||||
|
--- |
||||||
|
线程的消息队列是怎么创建的? |
||||||
|
--- |
||||||
|
|
||||||
|
1. 可以在子线程创建 handler 嘛? |
||||||
|
2. 主线程的 Looper 和子线程的 Looper 有什么区别? |
||||||
|
3. Looper 的 MessageQueue 有什么关系? |
||||||
|
4. MessageQueue 是怎么创建的? |
||||||
|
|
||||||
|
NativeMessageQueue: |
||||||
|
|
||||||
|
```c++ |
||||||
|
jlong MessageQueue_nativeInit(JNIEnv* env, jclass clazz){ |
||||||
|
NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue(); |
||||||
|
return reinterpret_cast<jlong>(nativeMessageQueue); |
||||||
|
} |
||||||
|
NativeMessageQueue::NativeMessageQueue(){ |
||||||
|
mLooper = Looper::getForThread(); |
||||||
|
if(mLooper == NULL){ |
||||||
|
mLooper = new Looper(false); |
||||||
|
Looper::setForThread(mLooper); |
||||||
|
} |
||||||
|
} |
||||||
|
sp<Looper> Looper::getForThread(){ |
||||||
|
int result = pthread_once(& gTLSOnce, initTLSKey); |
||||||
|
return (Looper*)pthread_getspecific(gTLSKey); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Native Looper: |
||||||
|
|
||||||
|
```c++ |
||||||
|
Looper::Looper(bool allowNonCallbacks){ |
||||||
|
mWakeEventFd = eventfd(0, EFD_NONBLOCK); |
||||||
|
rebuildEpollLocked(); |
||||||
|
} |
||||||
|
void Looper::rebuildEpollLocked(){ |
||||||
|
mEpollFd = epoll_create(EPOLL_SIZE_HINT); |
||||||
|
struct epoll_event eventItem; |
||||||
|
memset(& eventItem, 0, sizeof(epoll_event)); |
||||||
|
eventItem.events = EPOLLIN; |
||||||
|
eventItem.data.fd = mWakeEventFd; |
||||||
|
epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeEventFd, & eventItem); |
||||||
|
} |
||||||
|
void Looper::wake(){ |
||||||
|
uint64_t inc = 1; |
||||||
|
ssize_t nWrite = write(mWakeEventFd, &inc, sizeof(uint64_t)); |
||||||
|
} |
||||||
|
int Looper::pollOnce(int timeoutMillis, int* outFd, ...){ |
||||||
|
for(;;){ |
||||||
|
pollInner(timeoutMillis); |
||||||
|
} |
||||||
|
} |
||||||
|
int Looper::pollInner(int timeoutMillis){ |
||||||
|
struct epoll_event eventItems[EPOLL_MAX_EVENTS]; |
||||||
|
int eventCount = epoll_wait(mEpollFd, eventItems, ...); |
||||||
|
for(int i=0;i<eventCount;i++){ |
||||||
|
int fd = eventItems[i].data.fd; |
||||||
|
uint32_t epollEvents = eventItems[i].events; |
||||||
|
if(fd==mWakeEventFd&&(epollEvents&EPOLLIN)){ |
||||||
|
awoken(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
void Looper::awoken(){ |
||||||
|
uint64_t counter; |
||||||
|
read(mWakeEventFd, &counter, sizeof(uint64_t)); |
||||||
|
} |
||||||
|
``` |
Loading…
Reference in new issue