嗨我试着做一个搜索每5-10秒附近的蓝牙设备的应用程序,所以我试着做一个无限循环,但是当我按下启动循环的按钮时应用程序卡住了:
int stopInt=2;
serachB.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
do {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
listAdapter.clear();
getPairedDevices();
startDiscovery();
}
}, 4000);
} while (stopInt>1);
}
答案 0 :(得分:1)
private final Handler mMyhandler = new Handler();
private final Runnable checkBluetoothRunnable = new Runnable() {
public void run() {
//Do your work here
mMyHandler.postDelayed(this, 5000);
}
};
serachB.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v){
mMyhandler.post(checkBluetoothRunnable);
}
}
}
答案 1 :(得分:0)
以这种方式改变:
serachB.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
while(true){
listAdapter.clear();
getPairedDevices();
startDiscovery();
Thread.sleep(4000);
}
}
});
}}
答案 2 :(得分:0)
您不断在Handler
循环中创建while
的新实例,这会占用内存。如果你得到导致终止的OutOfMemoryError
,我不会感到惊讶。尝试在循环外创建单个实例。
传递给Runnable
的{{1}}在Handler
上运行,因为它是在该线程上创建的。对于冗长的操作应该避免这种情况,而是委托给另一个线程。
创建新的Handler时,它将绑定到线程/消息 正在创建它的线程的队列
此外,您可以将UIThread
类替换为使用Handler
,而不是使用ScheduledThreadPoolExecutor
类,这将为您提供一个线程池,然后可以定期执行您的设备发现代码。
首先创建一个ScheduledExecutorService
:
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
创建Runnable
的实例:
MyRunnable deviceDiscovery = new MyRunnable();
然后在onClick
方法中,您使用scheduleAtFixedRate
:
ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(deviceDiscovery, 0, 1, TimeUnit.MINUTES);
然后,当您想要停止运行时,您需要致电cancel
上的ScheduledFuture
:
future.cancel(true); // Set to true to say it can interrupt if already running