问题描述
我在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
类)。在其他地方运行时,您需要查看从何处获取Context
,例如this.getContext()
中的Fragment
(假设Fragment
附加到Activity
上)。在这种情况下,即使(非主题)ApplicationContext
也足够。
我解决了这一问题,在build.gradle(模块)中添加了一行。我添加了这个:
implementation 'com.android.support:support-v4:30.x.x'
数字30是我在同一文件中找到的compileSdkVersion