把napi接口调用放到ui线程中去

Signed-off-by: zhouyongfei <zhouyongfei@huawei.com>
This commit is contained in:
zhouyongfei
2021-10-19 16:20:57 +08:00
parent ed5f1e003d
commit 6b09909ac3
2 changed files with 74 additions and 17 deletions
@@ -45,6 +45,14 @@ namespace MiscServices {
EventListener *first_;
EventListener *last_;
};
class UvWorkMsg{
public:
UvWorkMsg(const char *type, Event *event);
~UvWorkMsg(){};
char *type_;
Event *event_;
};
}
}
#endif // INPUT_METHOD_NAPI_EVENT_TARGET_H
@@ -162,24 +162,73 @@ namespace MiscServices {
void EventTarget::Emit(const char *type, Event *event)
{
IMSA_HILOGI("EventTarget::Emit");
napi_handle_scope scope = nullptr;
napi_open_handle_scope(env_, &scope);
napi_value thisVar = nullptr;
napi_get_reference_value(env_, thisVarRef_, &thisVar);
for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) {
if (strcmp(eventListener->type, type) == 0) {
napi_value jsEvent = event ? event->ToJsObject() : nullptr;
napi_value handler = nullptr;
napi_value result = nullptr;
napi_get_reference_value(env_, eventListener->handlerRef, &handler);
napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result);
if (eventListener->isOnce) {
Off(type, handler);
}
}
uv_loop_s *loop = nullptr;
napi_get_uv_event_loop(env_, &loop);
if (loop == nullptr) {
IMSA_HILOGI("EventTarget::Emit loop == nullptr");
return;
}
napi_close_handle_scope(env_, scope);
uv_work_t *work1 = new (std::nothrow) uv_work_t;
if (work1 == nullptr) {
IMSA_HILOGI("EventTarget::Emit No memory work1 == nullptr");
return;
}
UvWorkMsg *workData = new (std::nothrow) UvWorkMsg(type, event);
if (workData == nullptr) {
IMSA_HILOGI("EventTarget::Emit No memory workData == nullptr");
delete work1;
return;
}
work1->data = reinterpret_cast<void *>(workData);
int ret = uv_queue_work(loop, work1, [](uv_work_t *work) {}, [](uv_work_t *work, int status) {
//Js Thread
if (work == nullptr) {
IMSA_HILOGI("EventTarget::Emit work == nullptr");
return;
}
UvWorkMsg *workMsg = reinterpret_cast<UvWorkMsg *>(work->data);
do {
if (!workMsg) {
IMSA_HILOGI("EventTarget::Emit workMsg is nullptr");
break;
}
napi_handle_scope scope = nullptr;
napi_open_handle_scope(env_, &scope);
napi_value thisVar = nullptr;
napi_get_reference_value(env_, thisVarRef_, &thisVar);
for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) {
if (strcmp(eventListener->type, workMsg->type) == 0) {
napi_value jsEvent = event ? event->ToJsObject() : nullptr;
napi_value handler = nullptr;
napi_value result = nullptr;
napi_get_reference_value(env_, eventListener->handlerRef, &handler);
napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result);
if (eventListener->isOnce) {
Off(workMsg->type, handler);
}
}
}
napi_close_handle_scope(env_, scope);
} while (0);
if (workMsg) {
delete workMsg;
}
delete work;
});
if (ret != 0) {
IMSA_HILOGI("EventTarget::Emit failed to execute libuv work queue");
delete workData;
delete work1;
}
}
UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event)
{
}
}
}