這是我的第一篇博客百揭,寫的不好之處歡迎指正!
最近公司要做個聊天功能蜓席,使用到了stomp協(xié)議器一,參考了幾位前輩的文章,做個總結厨内,需要的小伙伴請拿走不謝祈秕。
關于stomp是什么可參考:http://www.reibang.com/p/cee941ca0c09。
項目里之前用的okhttp3,但是okhttp3不支持stomp雏胃,無奈请毛,我只好另引入了一個庫。
StompProtocol官網(wǎng)地址:https://github.com/NaikSoftware/StompProtocolAndroid
1瞭亮,引入依賴
在項目app目錄下的build.gradle文件中添加
dependencies{
api"com.github.NaikSoftware:StompProtocolAndroid:1.6.4"
api"io.reactivex.rxjava2:rxjava:2.2.5"
}
2,創(chuàng)建連接
publicclassMainActivityextendsAppCompatActivity{
privateStompClientmStompClient;
//存放訂閱的容器類方仿、用來做資源回收,以免訂閱沒有被取消造成內存泄漏统翩。
privateCompositeDisposablecompositeDisposable;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//隱藏標題欄
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//初始化mStompClient仙蚜,第二個參數(shù)填入你預連接的服務器地址。
mStompClient=Stomp.over(Stomp.ConnectionProvider.OKHTTP,url);
resetSubscriptions();
connectStomp();
}
publicvoidconnectStomp(){
//頭信息集合唆缴,根據(jù)需要傳入
List<StompHeader>stompHeaderList=newArrayList<>();
mStompClient.withClientHeartbeat(1000).withServerHeartbeat(1000);
resetSubscriptions();
//注意以下兩個Disposable對象鳍征,第一個是創(chuàng)建連接的,第二個是創(chuàng)建訂閱的,訂閱可根據(jù)實際需求確定是否添加面徽。
DisposabledispLifecycle=mStompClient.lifecycle()
.subscribeOn(Schedulers.io())
//.observeOn(AndroidSchedulers.mainThread())
.subscribe(lifecycleEvent->{
switch(lifecycleEvent.getType()){
caseOPENED:
//連接成功
break;
caseERROR:
Log.e(TAG,"Stompconnectionerror",lifecycleEvent.getException());
//出錯了
break;
caseCLOSED:
//連接被關閉艳丛,可以在這里做重連操作匣掸。
resetSubscriptions();
connectStomp();
break;
caseFAILED_SERVER_HEARTBEAT:
break;
}
});
//將連接的Disposable對象加入compositeDisposable
compositeDisposable.add(dispLifecycle);
//訂閱
DisposabledispTopic=mStompClient.topic("填入你的訂閱地址")
.subscribeOn(Schedulers.io())
//.observeOn(AndroidSchedulers.mainThread())
.subscribe((StompMessagetopicMessage)->{
Log.d(TAG,"Received"+topicMessage.getPayload());
//取出消息,做邏輯處理
Stringbody=topicMessage.getPayload();
},throwable->{
//出錯了
Log.e(TAG,"連接錯誤",throwable);
});
//將訂閱的Disposable對象加入compositeDisposable
compositeDisposable.add(dispTopic);
//連接
mStompClient.connect(stompHeaderList);
}
privatevoidresetSubscriptions(){
if(compositeDisposable!=null){
compositeDisposable.dispose();
}
compositeDisposable=newCompositeDisposable();
}
3氮双,發(fā)送消息
//第一個參數(shù)傳訂閱的路徑碰酝,第二個傳要發(fā)送的消息
//注意必須調用subscribe()函數(shù)。
mStompClient.send(path,object.toString()).subscribe();
4戴差,資源回收
@Override
publicvoidonDestroy(){
//關閉連接和資源回收
mStompClient.disconnect();
if(compositeDisposable!=null){
compositeDisposable.dispose();
}
handler.removeCallbacksAndMessages(null);
super.onDestroy();
}
5送爸,添加全局異常補貨,否則連接失敗后會閃退
RxJavaPlugins.setErrorHandler(newConsumer<Throwable>(){
@Override
publicvoidaccept(Throwablethrowable)throwsException{
}
});
最后別忘了在AndroidManifest.xml文件中添加網(wǎng)絡訪問權限
<uses-permissionandroid:name="android.permission.INTERNET"/>