簡體   English   中英

需要有關如何延遲或在后台運行功能的幫助(android app)

[英]need help on how to either delay or run function in background (android App)

我下面的代碼是我的主要活動。 基本上,每當我單擊該按鈕時,它都會首先檢查是否設置了警報,如果警報為假,它將進入循環,該循環讀取所連接設備上的RSSI,直到其高於RSSI值為止。 我的問題是我如何使此循環不崩潰我的應用程序,它目前正在這樣做。 同樣由於某種原因,mRSSI文本字段永遠不會填充RSSI值。 有人可以幫我嗎。 這是我需要完成的應用程序中的最后一件事。

    public void onMonitorClick(final View view){
    if (isBLEEnabled()) {
        if (!isDeviceConnected()) {
            // do nothing
        } else if (isImmediateAlertOn == true) {
            showMonitor();
            DebugLogger.v(TAG, "app is high alert");
            isImmediateAlertOn = true;
        }
        else {
            DebugLogger.v(TAG, "app is no alert");
            hideMonitor();
            while(monitorStop != 1) 
            {

            ((ProximityService.ProximityBinder) getService()).getRssi();
            rssilevel = ((ProximityService.ProximityBinder) getService()).getRssiValue();
            if (rssilevel > -50 )   {
                DebugLogger.v(TAG, "greater then -50");
                monitorStop = 1;
            }
            mRSSI.setText("-" + String.valueOf(rssilevel) + "dB");
            isImmediateAlertOn = false;
            mFindMeButton.setEnabled(false);

            }
        }
    } else {
        showBLEDialog();
    }
}

編輯重做代碼

public void onMonitorClick(final View view){
    if (isBLEEnabled()) {
        if (!isDeviceConnected()) {
                // do nothing
            } else if (monitorvis == 0) {
                showMonitor();              

        } else if (isImmediateAlertOn == true) {
            showMonitor();
            DebugLogger.v(TAG, "app is high alert");
            isImmediateAlertOn = true;
        }
        else {
            DebugLogger.v(TAG, "app is no alert");
            hideMonitor();
            monitorStop = 0; 
            do { run(); run2(); } while(monitorStop != 1);

        }
    } else {
        showBLEDialog();
    }
}


protected void run() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            ((ProximityService.ProximityBinder) getService()).getRssi();
            rssilevel = ((ProximityService.ProximityBinder) getService()).getRssiValue();
            mRSSI.setText("-" + String.valueOf(rssilevel) + "dB");

        }
    });
}

protected void run2() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mRSSI.setText("-" + String.valueOf(rssilevel) + "dB");
            if (rssilevel < -60)
            {
                monitorStop = 1;
                showMonitor();
                ((ProximityService.ProximityBinder) getService()).startImmediateAlert();
            }

        }
    });
}

這是(IMHO)延遲執行一段代碼的最簡單方法:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do what you need to do
    }
}, MILISECONDS_BEFORE_EXECUTION);

在這里, MILISECONDS_BEFORE_EXECUTION是執行代碼之前需要等待的毫秒數(常數或變量)。 Android中Handler文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM