成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

微信開源mars源碼分析2—上層samples分析(續(xù))

MyFaith / 2417人閱讀

摘要:本來是想直接深入到的核心層去看的,但是發(fā)現(xiàn)其實(shí)上面的部分還有好些沒有分析到,因此回來繼續(xù)分析。另外一個(gè),是專用于統(tǒng)計(jì)的,我們暫時(shí)不去關(guān)注。具體的內(nèi)容我會(huì)在后面的核心層分析的時(shí)候指出。準(zhǔn)備下一篇進(jìn)行的核心層分析吧。

本來是想直接深入到mars的核心層去看的,但是發(fā)現(xiàn)其實(shí)上面的samples部分還有好些沒有分析到,因此回來繼續(xù)分析。
ConversationActivity這個(gè)類中實(shí)際上還做了很多的工作,在onCreate中:

final MainService mainService = new MainService();
    MarsServiceProxy.setOnPushMessageListener(BaseConstants.CGIHISTORY_CMDID, mainService);
    MarsServiceProxy.setOnPushMessageListener(BaseConstants.CONNSTATUS_CMDID, mainService);
    MarsServiceProxy.setOnPushMessageListener(BaseConstants.FLOW_CMDID, mainService);
    MarsServiceProxy.setOnPushMessageListener(BaseConstants.PUSHMSG_CMDID, mainService);
    MarsServiceProxy.setOnPushMessageListener(BaseConstants.SDTRESULT_CMDID, mainService);

這里出現(xiàn)了一個(gè)MainService,我們來看看:
/mars-master/samples/android/marsSampleChat/app/src/main/java/com/tencent/mars/sample/core/MainService.java

public class MainService implements PushMessageHandler {
        
            public static String TAG = "Mars.Sample.MainService";
        
            private Thread recvThread;
        
            private LinkedBlockingQueue pushMessages = new LinkedBlockingQueue<>();
        
            private BusinessHandler[] handlers = new BusinessHandler[]{
                    new MessageHandler(),
                    new StatisticHandler()
            };
        
            public MainService() {
                this.start();
            }
        
            public void start() {
                if (recvThread == null) {
                    recvThread = new Thread(pushReceiver, "PUSH-RECEIVER");
        
                    recvThread.start();
                }
            }
        
            private final Runnable pushReceiver = new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            PushMessage pushMessage = pushMessages.take();
                            if (pushMessage != null) {
                                for (BusinessHandler handler : handlers) {
                                    if (handler.handleRecvMessage(pushMessage)) {
                                        break;
                                    }
                                }
                            }
        
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e1) {
                                //
                            }
                        }
                    }
                }
            };
        
            @Override
            public void process(PushMessage message) {
                pushMessages.offer(message);
            }
        }
1.啟動(dòng)了一個(gè)接受者線程pushReceiver;
2.pushReceiver從LinkedBlockingQueue的pushMessages中不斷獲取message,然后通知到handlers的每個(gè)成員中,handlers是這樣定義的:
private BusinessHandler[] handlers = new BusinessHandler[]{
                new MessageHandler(),
                new StatisticHandler()
        };
繼續(xù)往下看MessageHandler:
/mars-master/samples/android/marsSampleChat/app/src/main/java/com/tencent/mars/sample/core/MessageHandler.java
public class MessageHandler extends BusinessHandler{
    
        public static String TAG = MessageHandler.class.getSimpleName();
    
        @Override
        public boolean handleRecvMessage(PushMessage pushMessage) {
    
            switch (pushMessage.cmdId) {
                case Constants.PUSHCMD:
                {
                    try {
                        Messagepush.MessagePush message = Messagepush.MessagePush.parseFrom(pushMessage.buffer);
                        Intent intent = new Intent();
                        intent.setAction(Constants.PUSHACTION);
                        intent.putExtra("msgfrom", message.from);
                        intent.putExtra("msgcontent", message.content);
                        intent.putExtra("msgtopic", message.topic);
                        SampleApplicaton.getContext().sendBroadcast(intent);
                    } catch (InvalidProtocolBufferNanoException e) {
                        Log.e(TAG, "%s", e.toString());
                    }
                }
                    return true;
                default:
                    break;
            }
    
            return false;
        }
    }

如果是Constants.PUSHCMD類型的message,那么就發(fā)送一個(gè)廣播。這個(gè)廣播實(shí)際上會(huì)由Mars核心部分接收到,但是傳遞的intent參數(shù)其實(shí)沒有意義,核心部分只是根據(jù)每次的pushcmd進(jìn)行網(wǎng)絡(luò)狀態(tài)的檢查而已,這些后話我們?cè)诜治龊诵牡臅r(shí)候再說。
另外一個(gè)StatisticHandler,是專用于統(tǒng)計(jì)的,我們暫時(shí)不去關(guān)注。
讓我們回到ConversationActivity,在MainService的new之后,會(huì)調(diào)用MarsServiceProxy.setOnPushMessageListener多次,設(shè)置監(jiān)聽,我們來看看MarsServiceProxy里面如何運(yùn)轉(zhuǎn):

public static void setOnPushMessageListener(int cmdId, PushMessageHandler pushMessageHandler) {
    if (pushMessageHandler == null) {
        inst.pushMessageHandlerHashMap.remove(cmdId);
    } else {
        inst.pushMessageHandlerHashMap.put(cmdId, pushMessageHandler);
    }
}

添加了監(jiān)聽到一個(gè)支持高并發(fā)的hashmap中:

private ConcurrentHashMap pushMessageHandlerHashMap = new ConcurrentHashMap<>();
private MarsPushMessageFilter filter = new MarsPushMessageFilter.Stub() {

    @Override
    public boolean onRecv(int cmdId, byte[] buffer) throws RemoteException {
        PushMessageHandler handler = pushMessageHandlerHashMap.get(cmdId);
        if (handler != null) {
            Log.i(TAG, "processing push message, cmdid = %d", cmdId);
            PushMessage message = new PushMessage(cmdId, buffer);
            handler.process(message);
            return true;

        } else {
            Log.i(TAG, "no push message listener set for cmdid = %d, just ignored", cmdId);
        }

        return false;
    }
};

可以看到,這里創(chuàng)建了一個(gè)filter,這個(gè)filter在接收到一個(gè)cmd后,根據(jù)id查找到PushMessageHandler,然后調(diào)用hander.process,傳遞參數(shù)PushMessage,這個(gè)PushMessage實(shí)際上又是由cmdid和buffer組成的。這里的cmdid理解為一個(gè)指令的類型id即可。再到MainService中的process,其實(shí)就是加入PushMessage的一個(gè)隊(duì)列中等待處理。
回來看filter在何時(shí)調(diào)用的吧。
首先在MarsServiceProxy的onServiceConnected:

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
    Log.d(TAG, "remote mars service connected");

    try {
        service = MarsService.Stub.asInterface(iBinder);
        service.registerPushMessageFilter(filter);
        service.setAccountInfo(accountInfo.uin, accountInfo.userName);

    } catch (Exception e) {
        service = null;
    }
}

看到了吧,將這個(gè)filter注冊(cè)到了服務(wù)中。來吧,MarsServiceNative的registerPushMessageFilter:

@Override
public void registerPushMessageFilter(MarsPushMessageFilter filter) throws RemoteException {
    stub.registerPushMessageFilter(filter);
}

到了MarsServiceStub里:

@Override
public void registerPushMessageFilter(MarsPushMessageFilter filter) throws RemoteException {
    filters.remove(filter);
    filters.add(filter);
}

加入了filters的隊(duì)列中,然后在onPush中有所調(diào)用:

@Override
public void onPush(int cmdid, byte[] data) {
    for (MarsPushMessageFilter filter : filters) {
        try {
            if (filter.onRecv(cmdid, data)) {
                break;
            }

        } catch (RemoteException e) {
            //
        }
    }
}

這里調(diào)用了每個(gè)filter的onRecv方法,這樣就和上面的串起來了吧。那么何時(shí)調(diào)用的這個(gè)onPush呢,答案在核心mars部分的StnLogic里面,這里規(guī)定了一個(gè)ICallBack,里面有onPush,會(huì)在適當(dāng)?shù)臅r(shí)候調(diào)用。具體的內(nèi)容我會(huì)在后面的mars核心層分析的時(shí)候指出。

總結(jié)一下:
MainService在一開始啟動(dòng),并且啟動(dòng)專門的線程處理接收到的pushMessage,處理的過程就是調(diào)用之前已經(jīng)準(zhǔn)備好的一個(gè)handler的隊(duì)列的每個(gè)項(xiàng)目的handleRecvMessage,其中的MessageHandler會(huì)發(fā)送廣播通知mars有pushcmd來了。
另一方面,MainService提供process調(diào)用向message隊(duì)列中加入新項(xiàng)目。這個(gè)加入的過程調(diào)用在MarsServiceProxy中進(jìn)行,內(nèi)部生成了一個(gè)filter過濾器,并將其注冊(cè)到服務(wù)MarsServiceNative中,MarsServiceNative其實(shí)也是走的MarsServiceStub,在他里面維護(hù)的filter的隊(duì)列,并且MarsServiceStub還是底層核心Mars的回調(diào)監(jiān)聽者,在onPush到來的時(shí)候,依次調(diào)用filter隊(duì)列中的各個(gè)項(xiàng)目的onRecv方法來實(shí)現(xiàn)通知。在filter的onRecv方法中就實(shí)現(xiàn)了handler.process(message),通知到了handler。

現(xiàn)在對(duì)于這部分應(yīng)該比較明晰了吧。準(zhǔn)備下一篇進(jìn)行Mars的核心層分析吧。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/66977.html

相關(guān)文章

  • 微信開源mars源碼分析1—上層samples分析

    摘要:微信已經(jīng)開源了,但是市面上相關(guān)的文章較少,即使有也是多在于使用等這些,那么這次我希望能夠從這個(gè)直接用于底層通訊的部分進(jìn)行個(gè)分析。首先明確下,微信用了的開源協(xié)議庫,來代替和。核心的部分我們先放下,下一篇再深入分析。 微信已經(jīng)開源了mars,但是市面上相關(guān)的文章較少,即使有也是多在于使用xlog等這些,那么這次我希望能夠從stn這個(gè)直接用于im底層通訊的部分進(jìn)行個(gè)分析。為了能分析的全面些,...

    caiyongji 評(píng)論0 收藏0
  • 微信開源mars源碼分析5—底層核心mars分析(續(xù)2)

    摘要:執(zhí)行并根據(jù)每個(gè)連接的狀態(tài)決定后續(xù)處理,上篇已經(jīng)講過,不再累述。上面的三段處理完畢后,應(yīng)該是數(shù)組中不再有連接才對(duì),這里的保險(xiǎn)處理是對(duì)數(shù)組再進(jìn)行檢查。至此跳出,算是整個(gè)連接過程完畢了。這里需要逐句分析,首先是。 最近回顧之前的文章,發(fā)現(xiàn)最后一篇有些著急了,很多地方?jīng)]有敘述清楚。這里先做個(gè)銜接吧。我們還是以長連接為例,從longlink.cc看起。首先是那個(gè)線程函數(shù)__Run:/mars-m...

    asce1885 評(píng)論0 收藏0
  • 微信終端開源數(shù)據(jù)庫 WCDB - Swift 版本

    摘要:作為微信的終端數(shù)據(jù)庫,從開源至今,共迭代了個(gè)版本。微信也轉(zhuǎn)向開發(fā)了嗎相信這會(huì)是大家非常關(guān)心的問題。不僅微信,國內(nèi)外大部分都還沒有完全轉(zhuǎn)向,但顯然這是個(gè)趨勢(shì)。另一方面,沒有微信的上線機(jī)制的保護(hù)和龐大的用戶量的驗(yàn)證,我們需要確保的穩(wěn)定性。 WCDB 作為微信的終端數(shù)據(jù)庫,從 2017.6 開源至今,共迭代了 5 個(gè)版本。我們一直關(guān)注開發(fā)者們的需求,并不斷優(yōu)化性能,新增如全文搜索等常用的功能...

    CloudDeveloper 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

MyFaith

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<