如何编写循环以便它不会阻止UI线程?

时间:2016-06-23 09:47:45

标签: java android

我是java和android的新手。 我在主UI线程中的服务中运行以下函数。

public void startSession() {
    Log.d(TAG, "startSession()");
    sessionStartRequestCompleted = false;
    int c =0;
    do {
        Log.d(TAG, "startSession() - Tyring again #" + c);
        writeCharacteristic(
                characteristicMap.get(ShsServiceConstants.SH_GATT_SVC_SESSION_TOGGLER_CHARACTERISTIC_UUID),
                ShsServiceConstants.SESSION_TOGGLER_CHAR_SESSION_START_OPCODE);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
        int timeout = 0;
        sessionStartStatus = false;
        checkSessionStatus();
        while (!sessionStartStatus && timeout < 10) {
            timeout++;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if (timeout >= 10) {
            Log.d(TAG, "StatusCheckTask Timed Out waiting for result");
            //fireNextShsGattRequest();
        }
        c++;
    } while (!sessionStartRequestCompleted);
}

但调用此函数会阻止UI线程。如何编写此函数,以便它不会阻止UI线程,但会检查标记。

标志正在onCharacteristicRead中设置。

6 个答案:

答案 0 :(得分:0)

使用处理程序线程在服务中执行操作。

答案 1 :(得分:0)

将循环包裹在

new AsyncTask<Void, Void, Void>(){
  protected Void doInBackground(){
    //your while loop
    return null;
  }

  protected void onPostExecute(){
    //here goes what you need to update when task end
  }
}

答案 2 :(得分:0)

我建议查看RxJava。在Android上你最终会使用它,它是android上最好的异步方法之一。

答案 3 :(得分:0)

在循环内定期使用Thread.yield()方法。由于循环没有阻塞状态,因此最好屈服,以便其他线程获得CPU时间。但是,现代Java编译器会自动定期生成,以避免只占用一个线程。

答案 4 :(得分:0)

您可以使用IntentService,因为它在新的后台线程上运行。另一种解决方案 - 使用RxJava库进行功能。 在RxJava中使用Schedulers.computation()scheduler

答案 5 :(得分:0)

文档说最简单的方法是使用AsyncTask

这里有很多信息: Handler vs AsyncTask vs Thread

https://developer.android.com/reference/android/os/AsyncTask.html