NoClassDefFoundError -> 如何让这个 kotlin 代码工作以实现 MQTT 连接?
NoClassDefFoundError -> How can I make this kotlin code work to implement a MQTT connection?
我在 this 网站上找到了这段代码,它为 Android 实现了一个 MQTT 客户端,它是用 Kotlin 编写的。
我对这门语言的经验真的很少,所以我不知道如何让它工作。我将它复制到我的 MainActivity.kt 文件中,然后从 onCreate 函数调用 connect(this):
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;
我能做什么?
当 运行 在 Activity
中时,您可以提供 this
作为 Context
(因为 Activity
是 Context
class).当 运行 在其他地方时,您需要查看从哪里获得 Context
,例如。 this.getContext()
在 Fragment
中(假设 Fragment
附加到 Activity
)。在这种情况下,即使是 (non-themed) ApplicationContext
也应该足够了。
我解决了在 build.gradle(模块)中添加一行的问题。我添加了这个:
implementation 'com.android.support:support-v4:30.x.x'
那个数字 30 是我在同一个文件中找到的 compileSdkVersion
我在 this 网站上找到了这段代码,它为 Android 实现了一个 MQTT 客户端,它是用 Kotlin 编写的。
我对这门语言的经验真的很少,所以我不知道如何让它工作。我将它复制到我的 MainActivity.kt 文件中,然后从 onCreate 函数调用 connect(this):
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;
我能做什么?
当 运行 在 Activity
中时,您可以提供 this
作为 Context
(因为 Activity
是 Context
class).当 运行 在其他地方时,您需要查看从哪里获得 Context
,例如。 this.getContext()
在 Fragment
中(假设 Fragment
附加到 Activity
)。在这种情况下,即使是 (non-themed) ApplicationContext
也应该足够了。
我解决了在 build.gradle(模块)中添加一行的问题。我添加了这个:
implementation 'com.android.support:support-v4:30.x.x'
那个数字 30 是我在同一个文件中找到的 compileSdkVersion