如何在不冻结UI的情况下在Android中运行无限循环?

时间:2012-07-02 13:55:48

标签: android

我正在创建和Android程序,需要继续通过蓝牙发送数据现在我使用这样的东西:

for(;;)
{
//send message
}

虽然这有效但它会冻结我的UI和应用程序如何在不冻结我的UI的情况下实现相同的功能?

我确信应用程序在监控数据时发送数据。

4 个答案:

答案 0 :(得分:7)

将循环放在AsyncTaskService中,使用单独的线程,或者只放在Activity旁边的另一个线程中。永远不要在主(UI)线程中做繁重的工作,infinte循环或阻止调用。

答案 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();
}