从 Android 蓝牙插座接收的数据仅在套接字终止后才会绘制在折线图中



我最近开始研究Android,Kotlin和MPAndroidChart。我正在开发一个从蓝牙服务器接收数据的Android应用程序,并且应该使用MPAndroidChart实时绘制获得的数据。

这是 Kotlin 代码:

package com.example.flowsensor
import ...
class ConnectionActivity:AppCompatActivity() {
companion object{
val TAG = "FlowSensor"
val APP_NAME = "FlowSensor"
var myUUID: UUID = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66")
var mBluetoothSocket: BluetoothSocket? = null
lateinit var mProgress: ProgressDialog
lateinit var mBluetoothAdapter: BluetoothAdapter
var mIsConnected: Boolean = false
lateinit var mAddress: String
lateinit var editText:EditText
lateinit var mChart:LineChart
var xVal:Int = 0
var yVal:Int = 0
}
override fun onCreate(savedInstanceState: Bundle?) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_connection)
mChart = findViewById<LineChart>(R.id.line_chart)
receive_button.setOnClickListener{
ReceiveData()
}
}
//1 parameters missing
private fun mAddEntry() {
Log.d(TAG, "yVal : $yVal")
var mData = mChart.data
if(mData != null){
var mDataSet = mData.getDataSetByIndex(0)
if(mDataSet == null){
mDataSet = createDataSet()
mData.addDataSet(mDataSet)
}
var mEntry:Entry = Entry( xVal.toFloat(), yVal.toFloat())
xVal++
mData.addEntry(mEntry, 0)
//Notify chart data has changed
mChart.notifyDataSetChanged()
//Limit no of visible entries
// mChart.setVisibleXRange(1f, 6f)
mChart.setVisibleXRangeMaximum(6f)
//Scroll to the last entry
mChart.moveViewToX(xVal.toFloat())
}
}
//1 parameter missing
private fun createDataSet(): LineDataSet? {
var mDataSet = LineDataSet(null, "Data vals")
//mDataSet.setDrawCubic
mDataSet.cubicIntensity = 0.2f
mDataSet.axisDependency = YAxis.AxisDependency.LEFT
mDataSet.setColor(ColorTemplate.getHoloBlue())
mDataSet.setCircleColor(ColorTemplate.getHoloBlue())
mDataSet.lineWidth = 2f
mDataSet.circleSize = 4f
mDataSet.fillAlpha = 65
mDataSet.fillColor = ColorTemplate.getHoloBlue()
mDataSet.highLightColor = Color.rgb(244, 117, 177)
mDataSet.valueTextColor = Color.WHITE
mDataSet.valueTextSize = 10f
return mDataSet
}
private fun ReceiveData() {
val buffer = ByteArray(1024) // buffer store for the stream
var bytes: Int // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
Log.d(TAG, "Inside ReceiveData()")
while (true) { // Read from the InputStream
if(mBluetoothSocket != null)
{
try {
bytes = mBluetoothSocket!!.inputStream.read(buffer)
val incomingMessage = String(buffer, 0, bytes)
Log.d(TAG, "InputStream: $incomingMessage")
yVal = incomingMessage.toInt()
mAddEntry()
} catch (e: IOException) {
Log.e(TAG, "write: Error reading Input Stream. " + e.message)
break
}
}
}
}
}

这是以详细模式记录的日志猫日志。

应用程序从主活动启动(此处未附加代码(,查找配对的设备,然后使用val intent = Intent(this, ConnectionActivity::class.java) intent.putExtra(EXTRA_ADDRESS, address) startActivity(intent)代码,控制到达连接活动(上面附加的代码(。

应用程序已成功从服务器接收数据;通过观察日志进行验证。在 ReceiveData(( 中,我尝试将接收到的数据传递给负责绘制图形的 mAddEntry((。但问题是,只有在我终止套接字后才会绘制数据,因此在附加的 logcat 日志中的第 112 行之后,所有数据都会一次绘制(没有数据丢失(。我想实时绘制数据,这就是我面临的问题。

注意:图形绘制已经通过使用timer.scheduleAtFixedRate在ConnectionActivity类的onCreate((中实时传递虚拟数据进行了独立验证。这正在按预期工作。

通过在 receive_button onClickListner 中调用 reciveData((,您正在执行 while 循环将运行,直到连接蓝牙套接字并在主线程上运行 (UIThread( 并且它将阻塞 UI 线程并且不允许任何其他 UI 更新发生,您应该在后台执行 reciveData(( 函数,当您想要在图表中绘制数据时,您应该在 UI 线程中传递数据或调用 UI 线程中的 mAddEntry(( 函数

最新更新