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

Signed-off-by: zhouyongfei <zhouyongfei@huawei.com>
This commit is contained in:
zhouyongfei
2021-10-20 10:46:36 +08:00
parent 6b09909ac3
commit 397e0dc25a
3 changed files with 36 additions and 47 deletions
@@ -17,6 +17,7 @@
#define INPUT_METHOD_NAPI_EVENT_TARGET_H
#include "napi/native_api.h"
#include "napi/native_node_api.h"
#include "global.h"
#include "input_method_ability.h"
@@ -37,7 +38,7 @@ namespace MiscServices {
virtual void Once(const char *type, napi_value handler);
virtual void Off(const char *type, napi_value handler);
virtual void Off(const char *type);
virtual void Emit(const char *type, Event *event);
virtual void Emit(sptr<EventTarget> &eventTarget, const char *type, Event *event);
protected:
napi_env env_;
@@ -45,14 +46,6 @@ 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
@@ -12,7 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <uv.h>
#include "event_target.h"
#include "securec.h"
@@ -29,6 +29,15 @@ namespace MiscServices {
EventListener *back = nullptr;
EventListener *next = nullptr;
};
struct EventTargetCB {
napi_env env;
napi_ref thisVarRef;
EventListener *first;
EventListener *last;
sptr<EventTarget> &eventTarget;
const char *type;
Event *event;
};
EventTarget::EventTarget(napi_env env, napi_value thisVar)
{
IMSA_HILOGI("EventTarget::EventTarget");
@@ -159,7 +168,7 @@ namespace MiscServices {
}
}
void EventTarget::Emit(const char *type, Event *event)
void EventTarget::Emit(sptr<EventTarget> &eventTarget, const char *type, Event *event)
{
IMSA_HILOGI("EventTarget::Emit");
uv_loop_s *loop = nullptr;
@@ -169,66 +178,53 @@ namespace MiscServices {
return;
}
uv_work_t *work1 = new (std::nothrow) uv_work_t;
if (work1 == nullptr) {
IMSA_HILOGI("EventTarget::Emit No memory work1 == nullptr");
uv_work_t *work = new (std::nothrow) uv_work_t;
if (work == nullptr) {
IMSA_HILOGI("EventTarget::Emit No memory work == nullptr");
return;
}
UvWorkMsg *workData = new (std::nothrow) UvWorkMsg(type, event);
if (workData == nullptr) {
IMSA_HILOGI("EventTarget::Emit No memory workData == nullptr");
delete work1;
return;
}
EventTargetCB *eventTargetCB = new (std::nothrow) EventTargetCB {.env = env_, .thisVarRef = thisVarRef_,
.first = first_, .last = last_, .type = type, .event = event, .eventTarget = eventTarget};
work1->data = reinterpret_cast<void *>(workData);
int ret = uv_queue_work(loop, work1, [](uv_work_t *work) {}, [](uv_work_t *work, int status) {
work->data = (void *)eventTargetCB;
int ret = uv_queue_work(loop, work, [](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);
EventTargetCB *eventTargetCB = (EventTargetCB *)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_open_handle_scope(eventTargetCB->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_get_reference_value(eventTargetCB->env, eventTargetCB->thisVarRef, &thisVar);
for (EventListener *eventListener = eventTargetCB->first; eventListener != nullptr; eventListener = eventListener->next) {
if (strcmp(eventListener->type, eventTargetCB->type) == 0) {
napi_value jsEvent = eventTargetCB->event ? eventTargetCB->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);
napi_get_reference_value(eventTargetCB->env, eventListener->handlerRef, &handler);
napi_call_function(eventTargetCB->env, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result);
if (eventListener->isOnce) {
Off(workMsg->type, handler);
eventTargetCB->eventTarget->Off(eventTargetCB->type, handler);
}
}
}
napi_close_handle_scope(env_, scope);
napi_close_handle_scope(eventTargetCB->env, scope);
} while (0);
if (workMsg) {
delete workMsg;
if (eventTargetCB) {
delete eventTargetCB;
}
delete work;
});
if (ret != 0) {
IMSA_HILOGI("EventTarget::Emit failed to execute libuv work queue");
delete workData;
delete work1;
delete work;
}
}
UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event)
{
}
}
}
@@ -240,13 +240,13 @@ namespace MiscServices {
void InputMethodAbility::ShowInputWindow()
{
IMSA_HILOGI("InputMethodAbility::ShowInputWindow");
eventTarget_->Emit("keyboardShow", nullptr);
eventTarget_->Emit(eventTarget_, "keyboardShow", nullptr);
}
void InputMethodAbility::DissmissInputWindow()
{
IMSA_HILOGI("InputMethodAbility::DissmissInputWindow");
eventTarget_->Emit("keyboardHide", nullptr);
eventTarget_->Emit(eventTarget_, "keyboardHide", nullptr);
}
bool InputMethodAbility::InsertText(const std::string text)