2017-01-31 2 views
0

Я использую в настоящее время https://github.com/NaikSoftware/StompProtocolAndroid для подключения websocket с использованием STOMP. У меня есть простая реализация, какДобавить тему/подписку после подключения клиента stomp


public class TestActivity extends AppCompatActivity { 

private StompClient mStompCLient; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 
    ButterKnife.bind(this); 
    setSupportActionBar(toolbar); 

    mStompCLient = Stomp.over(WebSocket.class, BASE_URL); 

    mStompCLient.topic("/topic/online/" + mSharedPreferences.getPrivateKey()).subscribe(new Subscriber<StompMessage>() { 
     @Override 
     public void onCompleted() { 
      Log.i(TAG, "/topic/online/ onCompleted: "); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.i(TAG, "/topic/online/ onError: " + e.getMessage()); 
     } 

     @Override 
     public void onNext(StompMessage stompMessage) { 
      Log.d(TAG, "/topic/online/ onNext: " + stompMessage.getPayload()); 
String content = ""; 
JSONObject jsonResponse = null; 
      try { 
       jsonResponse = new JSONObject(stompMessage.getPayload()); 
       content = jsonResponse.getString("uri"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
listenToUpdatesFromFinalUri(content); 
     } 
    }); 

    mStompCLient.lifecycle().subscribe(lifecycleEvent -> { 
     Log.i(TAG, "onCreate: " + lifecycleEvent.getMessage()); 
     switch (lifecycleEvent.getType()) { 

      case OPENED: 
       Log.d(TAG, "Stomp connection opened"); 
       break; 

      case ERROR: 
       Log.e(TAG, "Error", lifecycleEvent.getException()); 

       break; 

      case CLOSED: 
       Log.d(TAG, "Stomp connection closed : " + lifecycleEvent.toString() + " :msg: " + lifecycleEvent.getMessage() + " :escep: " + lifecycleEvent.getException() + " :headers: " + lifecycleEvent.getHandshakeResponseHeaders() + " :type: " + lifecycleEvent.getType()); 
       break; 
     } 
    }); 

mStompCLient.connect(); 
} 

private void listenToUpdatesFromFinalUri(String content) { 
    mStompCLient.topic(content).subscribe(new Subscriber<StompMessage>() { 
       @Override 
       public void onCompleted() { 
        Log.i(TAG," onCompleted: "); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Log.i(TAG, " onError: " + e.getMessage()); 
       } 

       @Override 
       public void onNext(StompMessage stompMessage) { 
        Log.d(TAG, " onNext: " + stompMessage.getPayload()); 
       } 
      }); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    disconnectStomp(); 
} 

private void disconnectStomp() { 
    mStompCLient.disconnect(); 
} 
} 

Здесь я пытаюсь слушать новый подписной канал посылается на сервер после того, как соединение установлено. Он работает, если вызов subscribe() вызывается до вызова соединения. Но окончательный канал uri/подписки, подписанный в функции listenToUpdatesFromFinalUri(), не является статическим, поэтому мне не нужно добавлять подписку перед подключением. В настоящее время я не могу получить ответ на окончательный uri/подписку. Любая помощь приветствуется.

ответ

Смежные вопросы