2014-09-08 1 views
0

AndroidPlot 꺾은 선형 차트에서 타임 스탬프에 대한 플로팅 온도 값을 표시하고 JSON 구문 분석을 통해 MySQL 데이터베이스에서 이러한 값의 여러 세트를 가져옵니다. 온도 값을 잘 받고 받고, 나는 목록에 그들을 저장하려고하지만 값을 플롯하면 아무것도 장치의 GUI에 나타나지 않습니다.AndroidPlot : Android 앱의 목록 데이터에서 꺾은 선형 차트를 표시 할 수 없습니다.

다음은 프로그램의 세부 정보입니다. AsyncTask를 사용하여 doInBackground() 메서드에서 임시 값을 검색하고 그래프를 그리는 코드를 onPostExecute()에 넣습니다. 데이터베이스에서 5 개의 값을 가져 오지만 이상하게도 목록에 넣고 그래프와 같은 5 개의 상수 값을 그래프로 표시하려고합니다. xValyVal 매개 변수의 크기가 동일해야 LogCat에서 오류가 발생합니다. JSON 구문 분석기에서 얻은 결과를 인쇄 했으므로 5 가지 값만 있습니다. 적어도 그래프 arraylist1에 대해 작동해야한다고 생각하지만 그래프는이 경우 비어 있습니다.

내 전체 활동 코드 :

public class MainActivity extends Activity { 

    public static XYPlot plot; 

    private ProgressDialog pDialog; 

    // Creating JSON Parser object 
    JSONParser jParser = new JSONParser(); 

    static List<Number> arraylist1 = new ArrayList<Number>(); 

    private static String url_sensor_data = "http://iotautomationtech.com/android_connect/get_sensor_data.php"; 

    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_deviceS = "devices"; 
    private static final String TAG_PID = "id"; 
    private static final String TAG_VAL = "value"; 
    private static final String TAG_TIME = "timestamp"; 

    Number[] seriesNumbers = { 1, 2, 3, 4, 5 }; 

    JSONParser jsonParser = new JSONParser(); 

    JSONArray devices = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.simple_xy_plot_example); 

     plot = (XYPlot) findViewById(R.id.mySimpleXYPlot); 

     new LoadSensorData().execute(); 

     plotDraw(); 

    } 

    class LoadSensorData extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Loading sensor data. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     protected String doInBackground(String... args) { 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      JSONObject json = jParser.makeHttpRequest(url_sensor_data, "GET", 
        params); 

      Log.d("Sensor data: ", json.toString()); 

      try { 

       int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 

        devices = json.getJSONArray(TAG_deviceS); 

        for (int i = 0; i < devices.length(); i++) { 

         JSONObject c = devices.getJSONObject(i); 

         String id = c.getString(TAG_PID); 
         String value1 = c.getString(TAG_VAL); // <-- temperature value from JSON parser 
         String time = c.getString(TAG_TIME); 

         value1.trim(); // <-- trim the string 

         if (isFloat(value1)) { 
          float tempVal = Float.parseFloat(value1); 
          arraylist1.add(tempVal); // <-- add it to arraylist1 if it is valid float 
         } 

         Log.d("Check: ", value1.toString()); // <-- returns 5 values in LogCat 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     protected void onPostExecute(String file_url) { 

      pDialog.dismiss(); 

     } 

    } 

    public static boolean isFloat(String number) { 
     try { 
      return (!new Float(number).isNaN()); 
     } catch (NumberFormatException e) { 
      return false; 
     } 
    } 

    public void plotDraw() { 

     plot.setDomainLabel("Time"); 
     plot.setRangeLabel("Temp"); 
     plot.setTitle("Temperature Trend"); 

     XYSeries series1 = new SimpleXYSeries(arraylist1, arraylist1, "Series1"); 

     LineAndPointFormatter series1Format = new LineAndPointFormatter(); 
     series1Format.setPointLabelFormatter(new PointLabelFormatter()); 
     series1Format.configure(getApplicationContext(), 
       R.xml.line_point_formatter_with_plf1); 

     plot.addSeries(series1, series1Format); 

     plot.setTicksPerRangeLabel(3); 
     plot.getGraphWidget().setDomainLabelOrientation(-45); 
    } 
} 

프로그램은 기본 테스트 기능이 잘 작동하고, 라인 차트까지 보여줍니다

XYSeries series1 = new SimpleXYSeries(Arrays.asList(seriesNumbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series1"); 

그리고 충돌하지 않는 들일 경우 나는이 일을하지만 아무런 선이 없다, 그냥 빈 차트 GUI :

 XYSeries series1 = new SimpleXYSeries(arraylist1, arraylist1, "Series1"); 

여기서 내가 뭘 잘못하고 있니? 온도의 값이 목록에 실제로 저장되어 있는지 확인하기 위해 arraylist1을 어떻게 트래버스 할 수 있습니까? SimpleXYSeries()가 처음에 여기에 보내는 매개 변수를 받아 들일 수 있습니까?

여기에 도움을 주시면 감사하겠습니다.

답변

2

백그라운드 스레드가 예상대로 동작한다고 가정하면 데이터를 추가 할 때 플롯을 다시 그리지 않는 것이 가장 큰 문제입니다. doLBackground (...) 메소드에서 arraylist1.add (tempVal) 뒤에 다음을 추가하십시오.

plot.redraw();