Реализация эффекта
Данный проект использует функцию имитации изменения прогресса загрузки файла, чтобы продемонстрировать способность JS FA подписываться на JAVA PA. После подписки JS может постоянно получать данные о прогрессе, возвращаемые JAVA, и использовать их для обновления индикатора выполнения на интерфейсе JS. Кроме того, после завершения имитации загрузки файл переходит на страницу вычисления, где пользователь вводит два числа, а затем нажимает кнопку вычисления. В результате демонстрируется способность JS FA вызывать JAVA PA. В этом случае данные не могут быть получены постоянно, как при подписке, а только один раз за вызов.
Проект позволяет изучить следующие функции:
/**
* Запрос на открытие режима подписки
*/
subscribe: async function() {
this.isShow = true; // Показать содержимое индикатора выполнения
var that = this;
var actionData = {};
actionData.firstNum = that.message;
var action = {};
action.bundleName = 'com.example.javajscommunication'; // Имя Ability, которое должно совпадать с PA, с учётом регистра
action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Имя Ability, которое должно совпадать с PA, с учётом регистра
action.messageCode = ACTION_MESSAGE_CODE_PLUS_SUB; // Код операции Ability (код операции определяет бизнес-функцию PA, которая должна быть согласована с PA)
action.data = actionData; // Данные, отправляемые в Ability, поля данных должны быть согласованы с PA
action.abilityType = ABILITY_TYPE_EXTERNAL; // Тип Ability, соответствующий различным реализациям PA
action.syncOption = ACTION_SYNC; // Опция синхронизации PA для обработки сообщений, 0: синхронный режим по умолчанию, 1: асинхронный режим
await FeatureAbility.subscribeAbilityEvent(action, function (callbackData) {
var callbackJson = JSON.parse(callbackData); // десериализация строки json
that.message = callbackJson.data.abilityEvent;
if (that.message == 100) { // когда message равно 100, перейти на страницу расчёта
router.push({
uri: "pages/calculate/calculate"
})
that.unsubscribe(); // Отменить подписку
that.isShow = false; // Скрыть индикатор выполнения
}
})
}
case ACTION_MESSAGE_CODE_PLUS_SUB: {
go = true; // Разрешить загрузку
remoteObjectHandler = data.readRemoteObject(); // Получить объект запроса
String zsonStr = data.readString(); // Получить строку параметров
try {
param = ZSONObject.stringToClass(zsonStr, RequestParam.class); // Преобразовать строку объекта в экземпляр RequestParam
} catch (RuntimeException e) {
}
startNotify(param); // Отправить информацию на JS
Map<String, Object> zsonResult = new HashMap<String, Object>();// Возвращаемый результат, ключевые поля должны быть согласованы с JS
zsonResult.put("code", SUCCESS);
reply.writeString(ZSONObject.toZSONString(zsonResult)); // Преобразование карты в строку json и возврат к JS
return true;
}
new Thread(() -> { // 开启线程
while (go) {
try {
Thread.sleep(5 * 3); // 线程睡眠15毫秒后继续往下执行
MessageParcel data = MessageParcel.obtain(); // 创建索引为0的空MessageParcel对象
MessageParcel reply = MessageParcel.obtain();
zsonEvent.put("abilityEvent", number++);
if (number == 101) { // number超过100 go状态设为false 下载结束
go = false;
}
data.writeString(ZSONObject.toZSONString(zsonEvent)); // 数据存到MessageParcel载体
remoteObjectHandler.sendRequest(100, data, reply, option); // 发送
reply.reclaim(); // 回收
data.reclaim();
} catch (RemoteException | InterruptedException e) {
break;
}
}
}).start();
Отмена подписки на js-странице и остановка возврата данных с java-сервера
Js-код:
/**
* Запрос отмены подписки, java-сервер прекращает возврат данных
*/
unsubscribe: async function() {
var action = {};
action.bundleName = 'com.example.javajscommunication'; // Ability's package name, needs to match PA, case sensitive
action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Ability name, needs to match PA, case sensitive
action.messageCode = ACTION_MESSAGE_CODE_PLUS_UNSUB; // Ability operation code (operation code defines PA's business functionality, needs to be agreed with PA)
action.abilityType = ABILITY_TYPE_EXTERNAL; // Ability type, corresponds to different implementation methods on PA
action.syncOption = ACTION_SYNC; // PA side request message processing sync/async option 0: sync mode, default mode. 1: async mode
var result = await FeatureAbility.unsubscribeAbilityEvent(action); // Отменить подписку
var ret = JSON.parse(result); // Десериализация
if (ret.code == 0) {
prompt.showToast({
message: 'Отмена загрузки прошла успешно'
})
} else {
prompt.showToast({
message: 'Ошибка при отмене загрузки'
})
}
}
Java-код сервера:
case ACTION_MESSAGE_CODE_PLUS_UNSUB: {
go = false; // Остановка цикла while в методе startNotify, прекращение отправки сообщений на js
Map<String, Object> zsonResult = new HashMap<String, Object>();
zsonResult.put("code", SUCCESS);
reply.writeString(ZSONObject.toZSONString(zsonResult)); // Ответ на js
return true;
}
Вызов PA для интерпретации
/**
* Получить переданное первое значение
*/
numOne (e){
this.numOne = e.value
},
/**
* Получение переданного второго значения
*/
numTwo (e){
this.numTwo = e.value
}
calculate: async function() {
var actionData = {}; // key values correspond to RequestParam class members on PA
actionData.firstNum = this.numOne;
actionData.secondNum = this.numTwo;
var action = {};
action.bundleName = 'com.example.javajscommunication'; // Ability's package name, needs to match PA, case sensitive
action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Ability name, needs to match PA, case sensitive
action.messageCode = ACTION_MESSAGE_CODE_PLUS; // Ability operation code (operation code defines PA's business functionality, needs to be agreed with PA)
action.data = actionData; // Data sent to Ability, data field names need to be agreed with PA
action.abilityType = ABILITY_TYPE_EXTERNAL; // Ability type, corresponds to different implementation methods on PA
action.syncOption = ACTION_SYNC; // PA side request message processing sync/async option 0: sync mode, default mode. 1: async mode
var result = await FeatureAbility.callAbility(action);
var ret = JSON.parse(result);
if (ret.code == 0) {
this.message = 'Java-сервер вернул данные:' + JSON.stringify(ret.abilityResult);
} else {
this.message = 'Ошибка в данных, возвращённых java-сервером' + JSON.stringify(ret.code);
}
},
case ACTION_MESSAGE_CODE_PLUS: {
String zsonStr = data.readString(); // Получение строки параметров
RequestParam param = new RequestParam();
try {
param = ZSONObject.stringToClass(zsonStr, RequestParam.class); // Преобразование строки в экземпляр RequestParam
} catch (RuntimeException e) {
}
// Возвращаемые данные поддерживают только сериализуемые типы объектов
Map<String, Object> zsonResult = new HashMap<>();
zsonResult.put("code", SUCCESS);
zsonResult.put("abilityResult", param.getFirstNum() + " * " + param.getSecondNum() + " = " + (param.getFirstNum() * param.getSecondNum()));
reply.writeString(ZSONObject.toZSONString(zsonResult)); // Данные возвращаются на js
return true;
}
back(){
router.back() // Вернуться на предыдущую страницу
}
Код можно посмотреть по ссылке:
https://gitee.com/chinasoft6_ohos/java-js-communication
Автор: Цзинь Гоцзюнь
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )