Я установил очень простое тестовое приложение. Это только текстовое представление, которое обновляется каждый раз, когда приходит новое сообщение от моего брокера mqtt, на которое я подписываюсь из моего приложения. Работает нормально, если я публикую sh сообщения брокеру каждую секунду, а также прилично каждые 0,5 секунды. Если я опубликую sh на брокере быстрее, чем этот пользовательский интерфейс в моем тестовом приложении android, возникают проблемы с рендерингом. Он не треснет sh, но время от времени зависает с крошечными небольшими шипами. Часто, когда это происходит, я получаю это сообщение в своем журнале. Msgstr "I / ViewRootImpl: jank_removeInvalidNode все узлы в списке jank вне времени". Если я скрываю пользовательский интерфейс, я могу видеть в logd, что каждое сообщение поступает плавно, без проблем, но, как только я задействую любую графику, оно не может идти в ногу идеально. Причина, по которой я тестирую это, заключается в том, что в дальнейшем я хочу делать анимацию на основе сообщений mqtt, которая в значительной степени будет в реальном времени. Это вообще возможно достичь? Я новичок в разработке Android и mqtt. Код из моего тестового проекта ниже.
publi c class MQTTHelper {
public MqttAndroidClient mqttAndroidClient;
String serverUri;
String subscriptionTopic;
String username;
String password;
public MQTTHelper(Context context, String serverUri, String clientId, String subscriptionTopic, String username, String password) {
this.serverUri = serverUri;
this.subscriptionTopic = subscriptionTopic;
this.username = username;
this.password = password;
mqttAndroidClient = new MqttAndroidClient(context,serverUri, clientId);
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
Log.d("connect", "connectComplete: " + serverURI);
}
@Override
public void connectionLost(Throwable cause) {
Log.d("connectionLost", "connectionLost: " + "Lost connection");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
connect();
}
public void setCallback(MqttCallbackExtended callback) {
mqttAndroidClient.setCallback(callback);
}
private void connect() {
MqttConnectOptions connectOptions = new MqttConnectOptions();
connectOptions.setAutomaticReconnect(true);
connectOptions.setCleanSession(false);
connectOptions.setUserName(username);
connectOptions.setPassword(password.toCharArray());
try {
mqttAndroidClient.connect(connectOptions, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
DisconnectedBufferOptions disconnectedBufferOptions = new DisconnectedBufferOptions();
disconnectedBufferOptions.setBufferEnabled(true);
disconnectedBufferOptions.setPersistBuffer(false);
disconnectedBufferOptions.setDeleteOldestMessages(false);
mqttAndroidClient.setBufferOpts(disconnectedBufferOptions);
subscribeToTopic();
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("onFailure", "Failed to connect to: " + serverUri + exception.toString());
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribeToTopic() {
try {
mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken asyncActionToken) {
Log.d("subscribe", "onSuccess: " + "subscribed");
}
@Override
public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
Log.d("subscribe", "onFailure: " + "subscription failed!");
}
});
} catch (MqttException e) {
System.err.println("Not able to subscribe");
e.printStackTrace();
}
}
}
publi c class MainActivity расширяет AppCompatActivity {
private MQTTHelper mqttHelper;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
connectToMQTTBroker();
}
private void connectToMQTTBroker() {
mqttHelper = new MQTTHelper(getApplicationContext(), SERVER_URI, CLIENT_ID, SUBSCRIPTION_TOPIC, USERNAME, PASSWORD);
mqttHelper.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
}
@Override
public void connectionLost(Throwable cause) {
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
Log.d("messageArrived", "messageArrived: " + message.toString());
String messageStr = message.toString();
textView.setText(messageStr);
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
}
}