0

Im using the GraphView Library to visualize real time graphs. The library example works fine in 2.X android devices, however it doesnt work properly in 4.X devices. The graph only get refreshed when I click the screen. Im newbie in Android but I think the problem could be the use of runnable and postDelayed.

This is the example code:

    package com.example.realtime;

import com.jjoe64.graphview.BarGraphView;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphView.LegendAlign;
import com.jjoe64.graphview.GraphViewSeries;
import com.jjoe64.graphview.LineGraphView;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.LinearLayout;




public class RealTimeGraph extends Activity {
    private final Handler mHandler = new Handler();
    private Runnable mTimer1;
    private Runnable mTimer2;
    private GraphView graphView;
    private GraphViewSeries exampleSeries1;
    private GraphViewSeries exampleSeries2;
    private double graph2LastXValue = 5d;

private double getRandom() {
    double high = 3;
    double low = 0.5;
    return Math.random() * (high - low) + low;
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.graphs);

    // init example series data
    exampleSeries1 = new GraphViewSeries(new GraphViewData[] {
            new GraphViewData(1, 2.0d)
            , new GraphViewData(2, 1.5d)
            , new GraphViewData(2.5, 3.0d) // another frequency
            , new GraphViewData(3, 2.5d)
            , new GraphViewData(4, 1.0d)
            , new GraphViewData(5, 3.0d)
    });

    // graph with dynamically genereated horizontal and vertical labels
    if (getIntent().getStringExtra("type").equals("bar")) {
        graphView = new BarGraphView(
                this // context
                , "GraphViewDemo" // heading
        );
    } else {
        graphView = new LineGraphView(
                this // context
                , "GraphViewDemo" // heading
        );
    }
    graphView.addSeries(exampleSeries1); // data

    LinearLayout layout = (LinearLayout) findViewById(R.id.graph1);
    layout.addView(graphView);

    // ----------
    exampleSeries2 = new GraphViewSeries(new GraphViewData[] {
            new GraphViewData(1, 2.0d)
            , new GraphViewData(2, 1.5d)
            , new GraphViewData(2.5, 3.0d) // another frequency
            , new GraphViewData(3, 2.5d)
            , new GraphViewData(4, 1.0d)
            , new GraphViewData(5, 3.0d)
    });

    // graph with custom labels and drawBackground
    if (getIntent().getStringExtra("type").equals("bar")) {
        graphView = new BarGraphView(
                this
                , "GraphViewDemo"
        );
    } else {
        graphView = new LineGraphView(
                this
                , "GraphViewDemo"
        );
        ((LineGraphView) graphView).setDrawBackground(true);
    }
    graphView.addSeries(exampleSeries2); // data
    graphView.setViewPort(1, 4);
    graphView.setScalable(true);

    layout = (LinearLayout) findViewById(R.id.graph2);
    layout.addView(graphView);
}

@Override
protected void onPause() {
    mHandler.removeCallbacks(mTimer1);
    mHandler.removeCallbacks(mTimer2);
    super.onPause();
}

@Override
protected void onResume() {
    super.onResume();
    mTimer1 = new Runnable() {
        @Override
        public void run() {
            exampleSeries1.resetData(new GraphViewData[] {
                    new GraphViewData(1, getRandom())
                    , new GraphViewData(2, getRandom())
                    , new GraphViewData(2.5, getRandom()) // another frequency
                    , new GraphViewData(3, getRandom())
                    , new GraphViewData(4, getRandom())
                    , new GraphViewData(5, getRandom())
            });
            mHandler.postDelayed(this, 300);
        }
    };
    mHandler.postDelayed(mTimer1, 300);

    mTimer2 = new Runnable() {
        @Override
        public void run() {
            graph2LastXValue += 1d;
            exampleSeries2.appendData(new GraphViewData(graph2LastXValue, getRandom()), true);
            mHandler.postDelayed(this, 1000);
        }
    };
    mHandler.postDelayed(mTimer2, 1000);
}

}`

The important code is inside the function OnResume.

Id really appreciate any hint...

Thanks in advance!

Rafag
  • 719
  • 3
  • 11
  • 27

1 Answers1

0

I don;t understand why do you call the posdelayed on handler twice - once inside the runnable and once after defining the runnable...

However , try to invalidate() the view once it's updated. I would do it like this :

@Override
protected void onResume() {
    super.onResume();
    mTimer1 = new Runnable() {
        @Override
        public void run() {
            exampleSeries1.resetData(new GraphViewData[] {
                    new GraphViewData(1, getRandom())
                    , new GraphViewData(2, getRandom())
                    , new GraphViewData(2.5, getRandom()) // another frequency
                    , new GraphViewData(3, getRandom())
                    , new GraphViewData(4, getRandom())
                    , new GraphViewData(5, getRandom())
            });
            exampleSeries1.invalidate();
        }
    };
    mHandler.postDelayed(mTimer1, 300);

    mTimer2 = new Runnable() {
        @Override
        public void run() {
            graph2LastXValue += 1d;
            exampleSeries2.appendData(new GraphViewData(graph2LastXValue, getRandom()), true);
            exampleSeries2.invalidate();
        }
    };
    mHandler.postDelayed(mTimer2, 1000);
}

Let me know if this works for you

Dan Riza
  • 397
  • 3
  • 11
  • The reason for calling postDelayed() from inside the run() method is so the runnable will be recursive and keep repeating itself with a 300ms delay...removing the postDelayed call from the run method means that this runnable will fire only once. – FoamyGuy May 13 '13 at 21:38
  • Exactly, thats the reason! Anymore ideas? – Rafag May 13 '13 at 21:57