2

Hello i want to refresh my activity by every second . i am doing in the following way but its not working please guide . Here is the code

public class MyActivity extends Activity {
     Prefs myprefs = null;
       private XYPlot mySimpleXYPlot;
       Number[] series1Numbers=new Number[10];
       Number[] series2Numbers=new Number[10];
       int a,b,c,d,ee,f,g;
    @Override
    public void onCreate(Bundle savedInstanceState)  {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.graphval);

         Intent intent = new Intent(this, MyActivity .class);
         PendingIntent sender = PendingIntent.getService(this, 0, intent, 0);


         long firstTime = SystemClock.elapsedRealtime();
         firstTime += 1 * 60 * 1000;


         AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
         am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,1 * 60 * 1000, sender);
         mySimpleXYPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot);



         this.myprefs = new Prefs(getApplicationContext());

         ArrayList<HashMap<String, Object>> mylist = new ArrayList<HashMap<String, Object>>(); 
        JSONObject json = JSONfunctions.getJSONfromURL("............");

         try{

            JSONArray  earthquakes = json.getJSONArray("graphs");

            for(int i=0;i<earthquakes.length();i++){                        
                HashMap<String, Object> map = new HashMap<String, Object>();
                 JSONObject e = earthquakes.getJSONObject(i);


             a = Integer.parseInt(e.getString("sensor_a"));
             b = Integer.parseInt(e.getString("sensor_b"));
             c = Integer.parseInt(e.getString("sensor_c"));
             d = Integer.parseInt(e.getString("sensor_d"));
             ee = Integer.parseInt(e.getString("sensor_e"));
             f = Integer.parseInt(e.getString("sensor_f"));
             g = Integer.parseInt(e.getString("sensor_g"));

           }  






            series1Numbers[0]=a;
            series1Numbers[1]=b;
            series1Numbers[2]=c;
            series1Numbers[3]=d;
            series1Numbers[4]=ee;
            series1Numbers[5]=f;
            series1Numbers[6]=g;

           // Turn the above arrays into XYSeries:
            XYSeries series1 = new SimpleXYSeries(
                    Arrays.asList(series1Numbers),          // SimpleXYSeries takes a List so turn our array into a List
                    SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
                    "Series1");                             // Set the display title of the series

            // Same as above, for series2
            XYSeries series2 = new SimpleXYSeries(Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, 
                    "Series2");

           // Create a formatter to use for drawing a series using LineAndPointRenderer:
            LineAndPointFormatter series1Format = new LineAndPointFormatter(
                    Color.rgb(0, 200, 0),                   // line color
                    Color.rgb(0, 100, 0),                   // point color
                    Color.rgb(150, 190, 150));              // fill color (optional)

            // Add series1 to the xyplot:
            mySimpleXYPlot.addSeries(series1, series1Format);

            // Same as above, with series2:
            mySimpleXYPlot.addSeries(series2, new LineAndPointFormatter(Color.rgb(0, 0, 200), Color.rgb(0, 0, 100),
                    Color.rgb(150, 150, 190)));


            // Reduce the number of range labels
            mySimpleXYPlot.setTicksPerRangeLabel(3);

            // By default, AndroidPlot displays developer guides to aid in laying out your plot.
            // To get rid of them call disableAllMarkup():
            mySimpleXYPlot.disableAllMarkup();





         }catch(JSONException e)        {
             Log.e("log_tag", "Error parsing data "+e.toString());
         }


    }  }   
user667340
  • 531
  • 2
  • 10
  • 21

2 Answers2

2

You could use a handler to refresh you activity.

public class MyActivity extends Activity {
    Handler handler = new Handler();
    ...
    public void onCreate(Bundle savedInstanceState)  {
        ...
        handler.postDelayed(runnable, 1000);
        ...
    }

    ....

    private Runnable runnable = new Runnable() {
        public void run() {
            if(activity is active) {
                // Do some updates
                handler.postDelayed(this, 1000);
            }
        }
    };
    ....
}
Alex
  • 2,033
  • 1
  • 24
  • 40
1

OnCreate only gets called once (upon creation) and cannot perform data refreshing.

If you want to refresh your data you need to perform the data changes in a background thread and then attach Listeners to perform the updates to your GraphView.

Here is a few examples of using a worker thread to update the UI.

Additionally for a more thorough understanding of updating UI elements and threading, google has a sample application which does this already and the sourcecode is available from:

Community
  • 1
  • 1
Justin Shield
  • 2,390
  • 16
  • 12
  • Thanks for your concern . Do you mean i have to do in the following way public void run() { while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(250); } catch (Exception e) {} // Update the ticker mTicker++; } } – user667340 Aug 01 '11 at 02:40
  • 2
    No, you need to read those tutorials and completely rework your solution. The assumption that you have that the views will automatically update if you change the underlying data is completely wrong. It does not. Using a timer is another approach [http://developer.android.com/resources/articles/timed-ui-updates.html](http://developer.android.com/resources/articles/timed-ui-updates.html) OR [http://developer.android.com/reference/java/util/Timer.html](http://developer.android.com/reference/java/util/Timer.html) – Justin Shield Aug 01 '11 at 02:47