NoClassDefFoundError -> Как я могу заставить этот код kotlin работать для реализации соединения MQTT?

#android #kotlin #mqtt #connect #noclassdeffounderror

#Android #котлин #mqtt #Контакты #noclassdeffounderror

Вопрос:

Я нашел этот код на этом сайте, он реализует клиент MQTT для Android, и он написан на Kotlin.

У меня действительно мало опыта работы с этим языком, поэтому я не понимаю, как заставить его работать. Я скопировал его в свой файл MainActivity.kt и вызываю connect (this) из функции onCreate:

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(findViewById(R.id.toolbar))
        connect(this)
        ...
  

Это функция подключения:

     private fun connect(context: Context){


        var serverURI = "tcp://broker.hivemq.com:1883"
        mqttClient = MqttAndroidClient(context, serverURI, "SmartFarmerApp")
        mqttClient.setCallback(object: MqttCallback{
            override fun messageArrived(topic: String?, message: MqttMessage?) {
                Log.d(TAG, "Receive message: ${message.toString()} from topic: $topic")
            }

            override fun connectionLost(cause: Throwable?) {
                Log.d(TAG, "Connection lost ${cause.toString()}")
            }

            override fun deliveryComplete(token: IMqttDeliveryToken?) {
                TODO("Not yet implemented")
            }
        })

        val options = MqttConnectOptions()
        try {
            mqttClient.connect(options, null , object: IMqttActionListener {
                override fun onSuccess(asyncActionToken: IMqttToken?) {
                    Log.d(TAG, "Connection success")
                }

                override fun onFailure(asyncActionToken: IMqttToken?, exception: Throwable?) {
                    Log.d(TAG, "Connection failure")
                }
            })
        }catch( e: MqttException){
            e.printStackTrace()
        }
    }
  

Первая строка внутри блока try выдает ошибку:
java.lang.Ошибка NoClassDefFoundError: сбой разрешения: Landroidx/localbroadcastmanager/content/LocalBroadcastManager;

Что я мог сделать?

Ответ №1:

При запуске внутри an Activity вы можете указать this как Context (как Activity Context класс). При запуске в другом месте вам нужно будет посмотреть, где получить Context from, например. this.getContext() внутри a Fragment (при Fragment условии, что он подключен к an Activity ). В этом случае даже (не тематического) ApplicationContext должно быть достаточно.

Комментарии:

1. У меня это не работает. Тогда, возможно, у меня другая проблема. Я вызываю connect (this) внутри функции onCreate. Внутри функции connect у меня есть «Ошибка NoClassDefFoundError: сбой разрешения: Landroidx / localbroadcastmanager /content / LocalBroadcastManager». Строка, которая выдает ошибку, является первой строкой внутри блока try , именно тогда, когда я вызываю MqttClient.connect(options, null, object: IMqttActionListener)

Ответ №2:

Я решил это, добавив строку в build.gradle (модуль). Я добавил это:

 implementation 'com.android.support:support-v4:30.x.x'
  

это число 30 — моя версия compileSdk, которую я нашел в том же файле