美文网首页
轻巧如燕的AMessage

轻巧如燕的AMessage

作者: ToFlyBear | 来源:发表于2019-04-08 23:08 被阅读0次

Android通过AMessage进行消息传递,充满了极其轻巧灵活的使用方式,让人不得不称赞

1)自发自用,发完不用管,最简单场景

```

void MediaPuller::pause() {

    (new AMessage(kWhatPause, this))->post();

}

void MediaPuller::onMessageReceived(const sp<AMessage> &msg) {

    switch (msg->what()) {

          case kWhatPause:

        {

            mPaused = true;

            break;

        }

···

2)发送后需要等待响应

···

status_t MediaPuller::start() {

    return postSynchronouslyAndReturnError(new AMessage(kWhatStart, this));

}

调用msg->postAndAwaitResponse()该函数里面实际是个condition_wait(),发送方卡在这边

status_t MediaPuller::postSynchronouslyAndReturnError(

        const sp<AMessage> &msg) {

    sp<AMessage> response;

    status_t err = msg->postAndAwaitResponse(&response);

    if (err != OK) {

        return err;

    }

    if (!response->findInt32("err", &err)) {

        err = OK;

    }

    return err;

}

接收方

void MediaPuller::onMessageReceived(const sp<AMessage> &msg) {

    switch (msg->what()) {

        case kWhatStart:

        {

           .......

            sp<AMessage> response = new AMessage;

            response->setInt32("err", err);

            sp<AReplyToken> replyID;

            CHECK(msg->senderAwaitsResponse(&replyID)); //查看msg是否设置过replyToken,设置过才需要回复

            response->postReply(replyID); //looper->postReply(replyToken, this);  实际是将发送方设置的tokern里reply message sp指向response; 然后broadcast signal 通知发送方就可以使用response消息了

            break;

···

3)消息里面带消息,然后等事件处理完成后再通过消息触发下一步操作

···

void WifiDisplaySource::PlaybackSession::Track::stopAsync() {

    sp<AMessage> msg = new AMessage(kWhatMediaPullerStopped, this);

             mMediaPuller->stopAsync(msg);

void MediaPuller::stopAsync(const sp<AMessage> &notify) {

    sp<AMessage> msg = new AMessage(kWhatStop, this);

    msg->setMessage("notify", notify);

    msg->post();

}

void MediaPuller::stopAsync(const sp<AMessage> &notify) {

    sp<AMessage> msg = new AMessage(kWhatStop, this);

    msg->setMessage("notify", notify);

    msg->post();

}

void MediaPuller::onMessageReceived(const sp<AMessage> &msg) {

    switch (msg->what()) {   

        case kWhatStop:

        {//执行完响应后回复消息

            sp<AMessage> notify;

            CHECK(msg->findMessage("notify", &notify));

            notify->post();

            break;

         }

···

暂时先总结这3种, android的关于message的使用场景非常丰富,等看到后面奇妙的地方再分享

相关文章

  • 轻巧如燕的AMessage

    Android通过AMessage进行消息传递,充满了极其轻巧灵活的使用方式,让人不得不称赞 1)自发自用,发完不...

  • AMessage

    基础数据结构定义: struct AMessage : public RefBase { AMessage()...

  • AMessage简析

    作为AMessage/ALooper/AHandler中最复杂的一环, AMessage被我放到了最后来讲. 希望...

  • 少年游.点水成金

    ------赞十米跳水金牌任茜 词/纫兰佩 高台云跳似穿针,一跃静幽琴。凌空如燕,翻飞轻巧,惊得浪花吟。 ...

  • 本事 (原创)

    能在钢絲上信步行走、跳舞,还能做难度大的翻跟头和各种杂技动作;能在薄冰上行走如飞,轻巧如燕。这真是本事。 生活犹如...

  • 2021-06-01

    e-mail: amessage@vip.163.com password: your English name+...

  • 如燕

    最近和室友聊天,问她,我们算不算有点事业心的女子?室友莞尔,不算吧,我们充其量只是挣扎在职场入口处的小白。 职场,...

  • ALooper简析

    接着ALooper、AMessage、AHandler的简述,现在来分析下ALooper的声明以及定义。 声明 这...

  • 肿起的脚踝,有泪滴在闪

    1.以为用双休日的两天休息,就可以轻巧如燕,随意翩飞。谁知,却是雨打梨花,如此轻易就凋落枝头。 2.一直以来的坚强...

  • 行如燕

    疫情高风十四天 静默居家度日闲 网中旅游山锦绣 一朝解封行如燕 2022年10月06日

网友评论

      本文标题:轻巧如燕的AMessage

      本文链接:https://www.haomeiwen.com/subject/qebmiqtx.html