2017-02-11 53 views
0

我正在開發一個基於傳感器的應用程序,我通過BLE連接不斷收集傳感器的數據,並將其顯示在圖形上。我想嚮應用程序添加一個算法,該算法將在接收到的每個新值上運行,並在UI中顯示結果。由於數據傳輸是連續進行的,我希望算法可以在後臺運行,因此要繪製的數據將保持速度。 我正在閱讀幾種方法(AsyncTask,Thread等),但作爲新手: 1.我不完全明白哪個更好 2.我無法正確實現它。當值改變時開始後臺任務java

下面是相關的代碼:

  public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 
//Call to the algorithm class  
RespAlgo myAlgo = new RespAlgo(); 
     @Override 
      protected void onCreate(Bundle savedInstanceState) { 
     //Code to initiate the graphs... 
     } 
     private final BluetoothGattCallback mGattCallback = 
        new BluetoothGattCallback() { 
     public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) 
     { 
     // Here I catch the data from the BLE device 
     for (int i_bt_nTs = 0; i_bt_nTs < getResources().getInteger(R.integer.bt_nTs); i_bt_nTs++) { 
           //V2V8, S1, S2, S3 
           // k = R3/(Rs + R4) = V2V8/(ADCval * LSB/Gain + V2V8/2) - 1 
           // Rs = R3/k - R4 

           v2v8_val = v2v8_2_bval * 2 * adc_lsb * vbat_correction; 
           k = v2v8_val/(characteristic.getIntValue(FORMAT_UINT16, 2 + 6 * i_bt_nTs) * adc_lsb/ina_gain + v2v8_val/2) - 1; 
           rs1 = R3/k - R4; 

           //run the algorithm. the below should move to parallel task 
           // Add counter to the algorithm 
             myAlgo.addTime(); 
           //Add value from the sensor to the algorithm 
             myAlgo.setValue(rs1); 
           //Return result to rr1 variable 
             rr1 = (float)myAlgo.getRR(); 
           // Change the UI with the new value 
             myRR1.setText(String.valueOf(rr1)); 

     } 
     } 
+0

最有可能的是,AsyncTask是最好的解決方案。它提供了比Thread更高級別的併發性抽象。 –

+0

AsyncTask可能是一個問題,因爲它基於固定大小的線程池,並在大量任務排隊等待執行時導致問題。 – Dibzmania

+0

如果您認爲自己的活動可能會停止或更改,請使用服務並回報該活動。 – Linxy

回答

1

創建一個本地服務,讓您的傳感器數據接收代碼綁定到這個地方的服務。綁定後,您可以將消息發送到服務並讓它在後臺處理它並更新UI或其他內容。 https://developer.android.com/guide/components/bound-services.html

另一個新的構造是使用事件總線,這將使您的代碼完全解耦,並且消除大部分行李(您剛剛接觸Android時會發現這更容易)。這裏檢查 - https://code.tutsplus.com/tutorials/quick-tip-how-to-use-the-eventbus-library--cms-22694

+0

謝謝,我將檢查服務和事件總線。 – Sagi