Live-Daten aus MySQL-Datenbank in GraphView anzeigen

  • Antworten:8
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 45

22.05.2017, 17:43:29 via Website

Hallo miteinander,

ich habe eine MySQL-Datenbank, in welche nacheinander "y-Werte" gespeichert werden. Diese sollen mit der Zeit (x-Achse) als Graph dargestellt werden. Wie man die Werte aus der DB holt, weiß ich schon. Nur mit der Live-Darstellung habe ich noch Probleme.

Wie würdet ihr vorgehen?

Grüße Basti

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

22.05.2017, 18:14:30 via Website

Hallo basti,
die DB Daten holst du hoffenlich nicht direkt über SQL sondern über eine entsprechende API oder? ;)

zum Problem: "Live"-View ist immer eine Sache, richtig "live" geht es garnicht. Du kannst dir in einem vorgefertigten Zeitintervall die Daten holen und dann anzeigen.

Zum Anzeigen bedienst du dich am besten diverser Libs aus dem Internet:
https://stackoverflow.com/questions/26467376/android-charting-libraries
Für sowas hab ich bisher das hier benutzt: http://www.achartengine.org/content/download.html

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 45

22.05.2017, 18:37:44 via Website

Realisier ich das Abfragen der Daten über ein gewisses Intervall mit der onResume-Methode? oder gibts eine andere Möglichkeit?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

22.05.2017, 18:42:21 via Website

Nein, wenn das Stichwort intervall fällt, ist immer ein Timer/countdownTimer gemeint.
Damit geht das am eifachsten.

Die onResume hat damit garnichts zu tun, das ist eine Methode in einer Activity die aufgerufen wird, wenn die App wieder in den Vordergrund kommt.

— geändert am 22.05.2017, 18:42:29

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 45

22.05.2017, 19:21:21 via Website

Okay werds probieren. Danke!

— geändert am 23.05.2017, 10:09:34

Antworten
  • Forum-Beiträge: 45

23.05.2017, 10:10:14 via Website

Hab jetzt mal probiert, erst einmal ohne Timer die Daten in den Graph zu laden. Bin nach einem Tutorial aus dem Internet gegangen (https://www.simplifiedcoding.net/android-json-parsing-retrieve-from-mysql-database/).

Hab dann den Code für mein Vorhaben abgeändert:

public class MessungActivity extends AppCompatActivity implements View.OnClickListener {

boolean messung = false;

private static final String TAG_RESULTS = "result";
private static final String TAG_X = "x";
private static final String TAG_Y = "y";

String myJSON;

JSONArray werte = null;

ArrayList<DataPoint> points = new ArrayList<>();
LineGraphSeries<DataPoint> series = new LineGraphSeries<DataPoint>();

GraphView graph;

DataPoint[] dbPoint;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_messung);


    Button button_messung_start = (Button) findViewById(R.id.button_messung_start);
    button_messung_start.setOnClickListener(this);

    Button button_messung_stopp = (Button) findViewById(R.id.button_messung_stopp);
    button_messung_stopp.setOnClickListener(this);

    graph = (GraphView) findViewById(R.id.graph);

    getData();
}

protected void addPoints() {
    try {
        JSONObject jsonObj = new JSONObject(myJSON);
        werte = jsonObj.getJSONArray(TAG_RESULTS);

        for (int i = 0; i < werte.length(); i++) {
            JSONObject c = werte.getJSONObject(i);

            String x = c.getString(TAG_X);
            String y = c.getString(TAG_Y);

            int xInt = Integer.valueOf(x);
            int yInt = Integer.valueOf(y);

            points.add(new DataPoint(xInt,yInt));
        }

        dbPoint = points.toArray(new DataPoint[points.size()]);

        series = new LineGraphSeries<>(dbPoint);

        // set manual X bounds
        graph.getViewport().setYAxisBoundsManual(true);
        graph.getViewport().setMinY(-150);
        graph.getViewport().setMaxY(150);

        graph.getViewport().setXAxisBoundsManual(true);
        graph.getViewport().setMinX(0);
        graph.getViewport().setMaxX(80);

        // enable scaling and scrolling
        graph.getViewport().setScalable(true);
        graph.getViewport().setScalableY(true);

        graph.getViewport().setScrollable(true);
        graph.getViewport().setScrollableY(true);

        graph.addSeries(series);


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

}

public void getData() {
    class GetDataJSON extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
            HttpPost httppost = new HttpPost("http://s466958426.online.de/basti/get-graph.php");

            // Depends on your web service
            httppost.setHeader("Content-type", "application/json");

            InputStream inputStream = null;
            String result = null;
            try {
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();

                inputStream = entity.getContent();
                // json is UTF-8 by default
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();

                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                result = sb.toString();
            } catch (Exception e) {
                // Oops
            } finally {
                try {
                    if (inputStream != null) inputStream.close();
                } catch (Exception squish) {
                }
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            myJSON = result;
            addPoints();
        }
    }
    GetDataJSON g = new GetDataJSON();
    g.execute();
}

PHP-Datei:

    <?php
    /*

    Hier stehen normalerweise die Daten der Datenbank.


    */


$con = mysqli_connect(HOST,USER,PASS,DB);

$sql = "select * from werte";

$res = mysqli_query($con,$sql);

$result = array();

while($row = mysqli_fetch_array($res)){
array_push($result,
array('x'=>$row[0],
'y'=>$row[1]
));
}

echo json_encode(array("result"=>$result));

mysqli_close($con);

?>

Leider zeigt er mir hier keine brauchbaren Werte an. Jemand eine Idee, an was das liegen könnte?

Viele Grüße
Basti

Antworten
  • Forum-Beiträge: 45

23.05.2017, 12:13:30 via Website

Also es haut doch hin mit dem oben geposteten Code.

Nun steht aber ein nächstes Problem an. Und zwar heißt es im Log nach einiger Zeit:

05-23 12:12:39.610 18294-18577/com.example.standard.measuringapp
E/OpenGLRenderer: GL error: Out of memory!

Kann man das irgendwie verhindern?

Viele Grüße
Basti

Antworten
  • Forum-Beiträge: 2.909

23.05.2017, 12:40:50 via Website

In dem du Resourcen freigibst oder die aus versehen mehrmals initiierst.

Schau mal in der Doku von GraphView (ich selbst kenne die nicht)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 45

23.05.2017, 17:22:09 via Website

Darauf gibt die Doku leider wenig Antworten. Es würde gehen, wenn man die Activity nach einer beliebigen Zeit immer wieder neustartet, aber das klingt mir eher nach einer Notlösung. Gibt es noch eine ander Möglichkeit, die Resourcen wieder freizugeben?

— geändert am 23.05.2017, 17:23:47

Antworten

Empfohlene Artikel