<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                根據前面的分析可知,MediaPlayerService駐留在MediaServer進程中,這個進程有兩個線程在talkWithDriver。假設其中有一個線程收到了請求,它最終會通過executeCommand調用來處理這個請求,實現代碼如下所示: **IPCThreadState.cpp** ~~~ status_t IPCThreadState::executeCommand(int32_tcmd) { BBinder*obj; RefBase::weakref_type* refs; status_tresult = NO_ERROR; switch(cmd) { case BR_ERROR: result = mIn.readInt32(); break; ...... caseBR_TRANSACTION: { binder_transaction_data tr; result = mIn.read(&tr, sizeof(tr)); if (result != NO_ERROR) break; Parcel buffer; Parcel reply; if (tr.target.ptr) { /* 看到BBinder,想起圖6-3了嗎? BnServiceXXX從BBinder派生, 這里的b實際就是實現BnServiceXXX的那個對象,這樣就直接定位到了業務層的對象。 */ sp<BBinder> b((BBinder*)tr.cookie); const status_t error = b->transact(tr.code, buffer, &reply, 0); if (error < NO_ERROR) reply.setError(error); } else { /* the_context_object是IPCThreadState.cpp中定義的一個全局變量。可通過 setTheContextObject函數設置。 */ const status_t error = the_context_object->transact(tr.code,buffer, &reply, 0); if (error < NO_ERROR) reply.setError(error); } break; ...... ~~~ BBinder和業務層有什么關系?還記得圖6-3嗎?我們以MediaPlayerService為例,來梳理一下其派生關系,如圖6-5所示: :-: ![](http://img.blog.csdn.net/20150802155954109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖6-5 MediaPlayerService家譜 BnMediaPlayerService實現了onTransact函數,它將根據消息碼調用對應的業務邏輯函數,這些業務邏輯函數由MediaPlayerService來實現。這一路的歷程,如下面的代碼所示: **Binder.cpp** ~~~ status_t BBinder::transact( uint32_tcode, const Parcel& data, Parcel* reply, uint32_t flags) { data.setDataPosition(0); status_terr = NO_ERROR; switch(code) { casePING_TRANSACTION: reply->writeInt32(pingBinder()); break; default: //調用子類的onTransact,這是一個虛函數。 err = onTransact(code, data, reply, flags); break; } if (reply!= NULL) { reply->setDataPosition(0); } returnerr; } ~~~ **IMediaPlayerService.cpp** ~~~ status_t BnMediaPlayerService::onTransact(uint32_tcode, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { ...... caseCREATE_MEDIA_RECORDER: { CHECK_INTERFACE(IMediaPlayerService, data, reply); //從請求數據中解析對應的參數 pid_t pid = data.readInt32(); //子類要實現createMediaRecorder函數。 sp<IMediaRecorder> recorder = createMediaRecorder(pid); reply->writeStrongBinder(recorder->asBinder()); return NO_ERROR; }break; caseCREATE_METADATA_RETRIEVER: { CHECK_INTERFACE(IMediaPlayerService, data, reply); pid_t pid = data.readInt32(); //子類要實現createMetadataRetriever函數 sp<IMediaMetadataRetriever> retriever =createMetadataRetriever(pid); reply->writeStrongBinder(retriever->asBinder()); return NO_ERROR; }break; default: return BBinder::onTransact(code, data, reply, flags); } } ~~~ 通過上面的分析,我們是否能更清晰地理解了圖6-3、圖6-4和圖6-5所表達的意義了呢?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看