我终于让我的应用程序正常运行,我只想解决一个问题。
我有一个按钮,它控制一个在后台运行几个函数的线程。当达到某个值时,后台中的函数最终会停止该线程。我遇到的问题是再次按下同一个按钮,手动停止线程。目前我只能启动线程并等待自己完成。我可以在应用程序中执行其他操作,因此线程自行运行,我只是想手动杀死它。
public void onMonitorClick(final View view){
if (isBLEEnabled()) {
if (!isDeviceConnected()) {
// do nothing
} else if (monitorvis == 0) {
showMonitor();
DebugLogger.v(TAG, "show monitor");
//monitorStop = 4;
Kill.runThread(); // I want a function here that would kill the
// thread below, or is there something that
// can be modified in runThread()?
// I did try Thread.Iteruppted() without luck
shutdownExecutor();
} else if (monitorvis == 1) {
hideMonitor();
DebugLogger.v(TAG, "hide monitor");
monitorStop = 0;
runThread(); //The running thread that works great on its own
}
}
else {
showBLEDialog();
}
}
private void runThread() {
new Thread() {
int i;
public void run() {
while (monitorStop != 3) { //This is where the thread stops itself
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
((ProximityService.ProximityBinder) getService()).getRssi();
rssilevel = ((ProximityService.ProximityBinder) getService()).getRssiValue();
mRSSI.setText(String.valueOf(rssilevel) + "dB");
detectRange(rssilevel);
}
});
Thread.sleep(750);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
答案 0 :(得分:0)
首先,你可以简单地设置monitorStop = 3,这会导致线程在超时完成后最终停止。
问题在于,我认为如果你再次按下按钮或者你的代码在将来的某个时刻修改了monitorStop,那么你想要死的那个,可能会保持活力。即:monitorStop需要保持等于3至少750毫秒,以确保线程能够完成它的循环和死亡。
执行此操作的正确方法是使用自己的monitorStop参数将线程创建为新类。创建线程时,您将保留对它的引用并修改线程的monitorStop参数。这样线程就可以不间断地完成。如果你想创建一个新线程,那么这不会影响旧线程的正确完成。