如何使用按钮切换停止正在运行的线程(android app)

时间:2014-07-30 01:35:03

标签: android

我终于让我的应用程序正常运行,我只想解决一个问题。

我有一个按钮,它控制一个在后台运行几个函数的线程。当达到某个值时,后台中的函数最终会停止该线程。我遇到的问题是再次按下同一个按钮,手动停止线程。目前我只能启动线程并等待自己完成。我可以在应用程序中执行其他操作,因此线程自行运行,我只是想手动杀死它。

    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();
}

1 个答案:

答案 0 :(得分:0)

首先,你可以简单地设置monitorStop = 3,这会导致线程在超时完成后最终停止。

问题在于,我认为如果你再次按下按钮或者你的代码在将来的某个时刻修改了monitorStop,那么你想要死的那个,可能会保持活力。即:monitorStop需要保持等于3至少750毫秒,以确保线程能够完成它的循环和死亡。

执行此操作的正确方法是使用自己的monitorStop参数将线程创建为新类。创建线程时,您将保留对它的引用并修改线程的monitorStop参数。这样线程就可以不间断地完成。如果你想创建一个新线程,那么这不会影响旧线程的正确完成。