【问题标题】:Pebble JS app_message_outbox_send() in a for loopPebble JS app_message_outbox_send() 在 for 循环中
【发布时间】:2014-02-28 21:26:34
【问题描述】:

我正在使用 sdk2 for pebble,带有 js appmessage 功能:

我正在尝试针对我的每个菜单项向手机上的 pebble js 发送连续消息。存在一个变量 movie_count = 5 ,我使用它进行循环,它被注销为 5 ,如下面的代码所示,所以它应该达到所有 5 ,至少记录错误,但它只是在之后不记录任何内容第一次:

static void up_click_handler(ClickRecognizerRef recognizer, void *context) {
 int i;
 APP_LOG(APP_LOG_LEVEL_DEBUG, "movie_count int %u", movie_count);
 for(i = 0;i<movie_count;i++){
    Tuplet build_menu_tuple =  TupletInteger(BUILD_MENU_KEY, 1); // just a flag for the  appmessage js code
    Tuplet menu_id_tuple =  TupletInteger(MENU_ID_KEY, i);
    DictionaryIterator *iter;
    app_message_outbox_begin(&iter);
    if (iter == NULL) {
       return;
    }
    dict_write_tuplet(iter, &build_menu_tuple);
    dict_write_tuplet(iter, &menu_id_tuple);
    dict_write_end(iter);
    app_message_outbox_send();
}
}

在 JS 应用消息中

js中的这段代码被执行了,虽然只执行了一次,我已经在我的watchapp的in_receiver()回调中记录了输出,并且我的第一个项目被记录了,但是记录器在那之后就退出了......这是因为watchapp 不能像这样循环发送蓝牙消息?有没有办法确保消息已发送,或暂停执行以使其以较慢的速度发送? (movies_json 存在于下面的代码上方,为简洁起见,我将其省略,但它在那里,一个带有电影内部数组的 json 对象)

if(e.payload.build_menu){

            var menu_id = e.payload.menu_id;

            console.log("menu_id" + menu_id);

            Pebble.sendAppMessage({"title":movies_json.movies[menu_id].title,

                                   "stars":movies_json.movies[menu_id].stars,

                                   "menu_id":menu_id

            });

            console.log("movie title:" + movies_json.movies[i].title);

        }

in_recived_handler 回调代码来处理来自 js 的消息

此代码在从手机 js 接收消息的回调中...它只获取第一项,仅记录第一项的 menu_id 和标题,然后停止记录。

if(menu_id_tuple){
  int menu_id;
  menu_id = menu_id_tuple->value->int32;
  char movie_title[30];
  strncpy(movie_title, movie_title_tuple->value->cstring, 30);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "In received handler movie_title: %s" , movie_title);
  APP_LOG(APP_LOG_LEVEL_DEBUG, "In received handler menu_id: %u" , menu_id);

}

【问题讨论】:

    标签: pebble-watch pebble-sdk


    【解决方案1】:

    您需要等到第一条消息发送后才能发送下一条。

    执行此操作的正确方法是为outbox_sent 事件注册回调,并将下一条消息放入此事件中。

    说明

    pebble 上只有一个蓝牙缓冲区,一次只能保存一条消息。如果您在 for 循环中发送消息,此缓冲区将被第一条消息填满,而所有其他消息都将被拒绝。

    如果您检查了app_message_outbox_send() 的返回值,您会看到错误消息。您还应该实现一个AppMessageOutboxFailed 处理程序。

    【讨论】:

    • 好的,这是有道理的。我正在尝试显示您上面所说的错误消息:AppMessageResult err_app_send = app_message_outbox_send(); APP_LOG(APP_LOG_LEVEL_DEBUG, "err app send %u", err_app_send);我是否走在正确的道路上,我对如何在 AppMessageResult 中获取错误代码感到困惑。当我在 for 循环中运行上面的代码时,它会打印出 'err arr send 0' 这是否对应于 AppMessageResult 中的第一个错误消息代码 'APP_MSG_OK' ?我原以为它会多次打印出错误代码,但又一次,它就停止了。我还在尝试调试。非常感谢!
    • 0 表示第一条消息已正确排队。我认为您第二次调用它 app_message_outbox_begin 返回 APP_MSG_BUSY 并将 iter 设置为 NULL。这会将您发送到您的退货声明中,这就是您看不到更多错误消息的原因。
    • 你一直在拯救我的一天!我盲目地从示例中的quotes.c 复制了它,这就是我粘贴的内容。我猜该代码只是为了检查 iter 中是否有内容的完整性检查,我想知道该代码的初衷是什么。
    • 您需要检查函数的返回值 - 或 iter 的值(这是示例所做的)。如果不这样做,您将尝试访问值为 NULL 的指针,您的程序将崩溃。
    猜你喜欢
    • 2021-10-25
    • 2021-12-03
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2020-11-04
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多