我正在创建和Android程序,需要继续通过蓝牙发送数据现在我使用这样的东西:
for(;;)
{
//send message
}
虽然这有效但它会冻结我的UI和应用程序如何在不冻结我的UI的情况下实现相同的功能?
我确信应用程序在监控数据时发送数据。
答案 0 :(得分:7)
答案 1 :(得分:1)
您需要将工作移动到另一个线程(UI线程除外),以防止ANR。
new Thread( new Runnable(){
@Override
public void run(){
Looper.prepare();
//do work here
}
}).start();
以上是一种快速而肮脏的方法,大多数情况下首选的方法是使用AsyncTask
答案 2 :(得分:1)
如果您使用的是Kotlin,则可以使用协程。
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.4"
全局初始化作业变量job:Job
然后做:
job =
GlobalScope.launch(Dispatchers.Default) {
while (job.isActive) {
//do whatever you want
}
}
要停止循环时执行job.cancel()
答案 3 :(得分:0)
启动一个IntentService,它将为您创建一个后台线程来运行您的服务。调用Looper.prepare()为@YellowJK建议,但是当您需要程序等待某些事情发生时调用Looper.loop()所以服务没有被杀死。
@Override
protected void onHandleIntent(Intent arg0) {
Looper.prepare();
//Do work here
//Once work is done and you are waiting for something such as a Broadcast Receiver or GPS Listenr call Looper.loop() so Service is not killed
Looper.loop();
}