2014-05-07 40 views
0

我通過BLE從傳感器接收溫度值並將其存儲在我的數據庫中,並通過意圖來傳遞值作爲數組來繪製線性圖和線圖。我也將這些值發佈到谷歌應用程序引擎。我在runOnUiThread()中完成了這一切,因此當值太多時,我的應用程序崩潰了。是否可以將值傳遞到新線程上的圖活動?或者其他更好的建議?在android的buttonclick中使用線程

 @Override 
     public void propertyChange(final PropertyChangeEvent event) { 
     final String property = event.getPropertyName(); 

     runOnUiThread(new Runnable() { 
      public void run() { 
      try {     
       if (property.equals(PROPERTY_IR_TEMPERATURE)) { 
       double newIRValue = (Double) event.getNewValue(); 
       // float newIRValue_1 = (Float) event.getNewValue(); 
       TextView textView = (TextView) findViewById(R.id.ir_temperature); 
       String value = decimal.format(newIRValue); 
       String formattedText = value + DEGREE_SYM; 

       float value_chk = (float)(newIRValue); 
       String formattedText_1 = String.valueOf(value_chk); 
       String sensorid = test_1; 
       String sensortype = "temperature"; 
      // write_data(sensorid,sensortype,value); 

      // Toast.makeText(getBaseContext(), "ARV sensid:"+sensorid+" senstype:"+sensortype, Toast.LENGTH_SHORT).show(); 

       long timemilli = System.currentTimeMillis(); 
       //Log.d("TIMMEE", String.valueOf(timemilli)); 
       String time=String.valueOf(timemilli); 
       db = new DBHandler(getApplicationContext()); 

       //db.deleteTempReadings(); 
       // inserting data to temp table 
       Log.i("insert", "Inserting Records..."); 
       ); 
       Temperature(sensorid,formattedText_1)); 
       //Toast.makeText(getBaseContext(), "SENSOR_ID:"+t.getSensorId()+"TEMPERATURE: "+t.getTemperature()+"TIME: "+t.getTimestamp(), Toast.LENGTH_LONG).show(); 
       // reading data from db 
       Log.i("Reading", "Reading Records..."); 

       List<Temperature> temp = db.getAllTempReadings(); 

       int arraySize=temp.size(); 
       double tempArray[]=new double[arraySize]; 
       int timeArray[]=new int [arraySize]; 


       //Log.d("ans", String.valueOf(temp.size())); 


       for (Temperature t : temp) { 

        String log="SENSOR ID: "+t.getSensorId()+"TEMPERATURE: "+t.getTemperature()+"TIME: "+t.getTimestamp(); 
        Log.d("Record"+t, log); 
       } 
        // Reading values into the array! 

        for(int i=0;i<arraySize;i++){ 

         tempArray[i]=Double.parseDouble(temp.get(i).getTemperature()); 


       } 

Button btn=(Button)findViewBy Id(R.id.btnGraph); 
btn.setOnCLickListener(new View.onClickListener(){ 
public void onClick(View v){ 
Intent iIntent =new Intent(getApplicationContext(),GraphActivity.class); 
tIntent.putExtra("tempArray",tempArray); 
startActivity(tIntent); 
} 
}); 
// rest....posting to server code...... 
textView.setText(formattedText); 
     } 
    } 
} 

}}

回答

0

你從傳感器獲得高達這一點,你需要做的東西在一個線程之後,你有溫度值來啓動三級螺紋一個用於插入到數據庫,另一個用於顯示折線圖以及將數據發佈到Google應用引擎中的最後一個和第三個。

+0

我可以在runOnUiThread()內創建新線程,因爲我正在獲取裏面的溫度值。 – Ansu

+0

不,但是你在做什麼,你是在一個線程中運行整個代碼,並從那個線程獲得溫度值,所以你必須等到該線程給出溫度值。所以,而不是使用這個線程,你必須使用[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html),然後,無論你在onPostExecute(Result)方法得到了什麼,那麼你有開始你的另一個線程。 – Sahil

+0

我應該爲Async Task創建一個獨立的類嗎?但溫度值可以通過屬性改變方法獲得。你可以給我一個粗略的想法如何通過一個例子去了解我的代碼。? – Ansu

0

我覺得你是一個有點糊塗這裏。這個想法是保持你的UI線程處理緩慢。我建議你先在'當前'(大概不那麼關鍵)線程中寫數據庫和App引擎,然後完成所有工作,只需在UI線程中更新圖形顯示即可。

您需要RunOnUiThread的唯一原因是對屏幕上的視圖進行更改。

+0

該視圖也正在改變。最後一行textView.setText(formattedText)進行更新。 – Ansu