9

I'm creating and android program which needs to to continuously keep sending data over the bluetooth now I use something like this:

for(;;)
{
//send message
}

though this works it freezes my UI and app how can I implement the same without freezing my UI?

I am sure that the app is sending the data as I monitor the data.

4

4 回答 4

7

把你的循环放在一个单独的线程中AsyncTaskService或者只是在你的活动旁边的另一个线程中。切勿在主 (UI) 线程中进行繁重的工作、无限循环或阻塞调用。

于 2012-07-02T14:00:44.140 回答
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()想让你的循环停止时做

于 2020-10-29T06:25:49.670 回答
0

启动一个 IntentService ,它将为您创建一个后台线程来运行您的服务。按照@YellowJK 的建议调用 Looper.prepare() ,但是当您需要您的程序等待某些事情发生时调用 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();
}
于 2012-07-02T14:13:36.520 回答
0

您需要将工作移至另一个线程(UI 线程除外),以防止 ANR。

new Thread( new Runnable(){
        @Override
        public void run(){
            Looper.prepare();
            //do work here
        }
    }).start();

以上是一种快速而肮脏的方法,大多数情况下首选的方法是使用 AsyncTask

于 2012-07-02T14:00:18.843 回答