移动到线程中处理

Signed-off-by: zhouyongfei <zhouyongfei@huawei.com>
This commit is contained in:
zhouyongfei
2022-03-01 10:42:04 +08:00
parent 6460a62efb
commit 9e1b912298
4 changed files with 50 additions and 25 deletions
@@ -35,6 +35,8 @@ namespace OHOS {
std::mutex mtx_;
NativeValue* OnRegisterCallback(NativeEngine& engine, NativeCallbackInfo& info);
NativeValue* OnUnRegisterCallback(NativeEngine& engine, NativeCallbackInfo& info);
std::shared_ptr<AppExecFwk::EventHandler> GetMainHandler();
std::shared_ptr<AppExecFwk::EventHandler> mainHandler_ = nullptr;
};
}
}
@@ -23,11 +23,15 @@
#include <refbase.h>
#include "native_engine/native_engine.h"
#include "native_engine/native_value.h"
#include "event_handler.h"
#include "event_runner.h"
namespace OHOS {
namespace MiscServices {
class JsInputMethodEngineListener : virtual public RefBase {
public:
explicit JsInputMethodEngineListener(NativeEngine* engine) : engine_(engine) {}
JsInputMethodEngineListener(NativeEngine* engine, std::shared_ptr<AppExecFwk::EventHandler> &handler)
: engine_(engine), mainHandler_(handler) {}
virtual ~JsInputMethodEngineListener() = default;
void RegisterListenerWithType(NativeEngine& engine, std::string type, NativeValue* value);
void UnregisterListenerWithType(std::string type, NativeValue* value);
@@ -43,6 +47,7 @@ namespace MiscServices {
NativeEngine* engine_ = nullptr;
std::mutex mMutex;
std::map<std::string, std::vector<std::unique_ptr<NativeReference>>> jsCbMap_;
std::shared_ptr<AppExecFwk::EventHandler> mainHandler_ = nullptr;
};
}
}
@@ -29,7 +29,8 @@ namespace MiscServices {
JsInputMethodEngine::JsInputMethodEngine(NativeEngine* engine)
{
IMSA_HILOGI("JsInputMethodEngine::Constructor is called");
imeListener_ = new JsInputMethodEngineListener(engine);
auto mainHandler = GetMainHandler();
imeListener_ = new JsInputMethodEngineListener(engine, mainHandler);
InputMethodAbility::GetInstance()->setImeListener(imeListener_);
}
@@ -39,6 +40,15 @@ namespace MiscServices {
std::unique_ptr<JsInputMethodEngine>(static_cast<JsInputMethodEngine*>(data));
}
std::shared_ptr<AppExecFwk::EventHandler> JsInputMethodEngine::GetMainHandler()
{
if (!mainHandler_) {
mainHandler_ =
std::make_shared<AppExecFwk::EventHandler>(AppExecFwk::EventRunner::GetMainEventRunner());
}
return mainHandler_;
}
NativeValue* JsInputMethodEngine::RegisterCallback(NativeEngine* engine, NativeCallbackInfo* info)
{
JsInputMethodEngine* me = CheckParamsAndGetThis<JsInputMethodEngine>(engine, info);
@@ -133,32 +133,37 @@ namespace MiscServices {
std::lock_guard<std::mutex> lock(mMutex);
IMSA_HILOGI("JsInputMethodEngineListener::OnKeyboardStatus");
NativeValue* nativeValue = engine_->CreateObject();
NativeObject* object = ConvertNativeValueTo<NativeObject>(nativeValue);
if (object == nullptr) {
IMSA_HILOGI("Failed to convert rect to jsObject");
return;
}
NativeValue* argv[] = {nativeValue};
std::string methodName;
if (isShow) {
methodName = "keyboardShow";
} else {
methodName = "keyboardHide";
}
CallJsMethod(methodName, argv, ArraySize(argv));
auto task = [this, isShow] () {
NativeValue* nativeValue = engine_->CreateObject();
NativeObject* object = ConvertNativeValueTo < NativeObject >(nativeValue);
if (object == nullptr) {
IMSA_HILOGI("Failed to convert rect to jsObject");
return;
}
NativeValue* argv[] = { nativeValue };
std::string methodName;
if (isShow) {
methodName = "keyboardShow";
} else {
methodName = "keyboardHide";
}
CallJsMethod(methodName, argv, ArraySize(argv));
};
mainHandler_->PostTask(task);
}
void JsInputMethodEngineListener::OnInputStart()
{
std::lock_guard<std::mutex> lock(mMutex);
IMSA_HILOGI("JsInputMethodEngineListener::OnInputStart");
NativeValue *nativeValuekb = CreateKeyboardController(*engine_);
NativeValue *nativeValuetx = CreateTextInputClient(*engine_);
NativeValue* argv[] = {nativeValuekb, nativeValuetx};
std::string methodName = "inputStart";
CallJsMethod(methodName, argv, ArraySize(argv));
auto task = [this] () {
NativeValue *nativeValuekb = CreateKeyboardController(*engine_);
NativeValue *nativeValuetx = CreateTextInputClient(*engine_);
NativeValue* argv[] = {nativeValuekb, nativeValuetx};
std::string methodName = "inputStart";
CallJsMethod(methodName, argv, ArraySize(argv));
};
mainHandler_->PostTask(task);
}
void JsInputMethodEngineListener::OnInputStop(std::string imeId)
@@ -166,11 +171,14 @@ namespace MiscServices {
std::lock_guard<std::mutex> lock(mMutex);
IMSA_HILOGI("JsInputMethodEngineListener::OnInputStop");
NativeValue* nativeValue = CreateJsValue(*engine_, imeId);
auto task = [this, imeId] () {
NativeValue* nativeValue = CreateJsValue(*engine_, imeId);
NativeValue* argv[] = {nativeValue};
std::string methodName = "inputStop";
CallJsMethod(methodName, argv, ArraySize(argv));
NativeValue* argv[] = { nativeValue };
std::string methodName = "inputStop";
CallJsMethod(methodName, argv, ArraySize(argv));
};
mainHandler_->PostTask(task);
}
}
}