我是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中设置。
答案 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