1

I have a service which is started by a BroadcastReceiver that activates when the boot is completed. So the service starts and I have the following on my onStartCommand

public int onStartCommand(Intent intent, int flags, int startId) {
    mQueue = Volley.newRequestQueue(getApplicationContext());

      //FROM NOW ON I WANT IT TO LOOP CONSTANTLY
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, API.getDeviceTypes(), null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        processResponse(response);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("mytag", "Error de response");
                    error.printStackTrace();
                }
            });

            mQueue.add(request);
          // LOOP TILL HERE



    return START_STICKY;
}

I want the service to make that request constantly or at least every 3 minutes or something. How can I achieve this? As of now the service starts ok but of course it only executes those lines once.

Flama
  • 772
  • 3
  • 13
  • 39

2 Answers2

2

Use Handler for your requirement do not use Thread it will block Main UI Thread

private Handler handler;
private Runnable runnable;


public int onStartCommand(Intent intent, int flags, int startId) {
      handler = new Handler();
        if (runnable != null) {
            runnable = null;
        }
        runnable = new Runnable() {
            @Override
            public void run() {
                // do your stuff here, called every 3 second
                mQueue = Volley.newRequestQueue(getApplicationContext());

      //FROM NOW ON I WANT IT TO LOOP CONSTANTLY
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, API.getDeviceTypes(), null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        processResponse(response);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("mytag", "Error de response");
                    error.printStackTrace();
                }
            });

            mQueue.add(request);
                h.postDelayed(this, 3000);
            }
        };

// start it with:
handler.post(runnable);

 return START_STICKY;


}

And dont forget to remove handler callback also in onDestroy() or in onstop according to your need

    handler.removeCallbacks(runnable);
    handler.removeMessages(0);

Read why handler is better from here difference between Thread and Handler

Quick learner
  • 10,632
  • 4
  • 45
  • 55
1

AlarmManager can be used to perform a task periodically:

Let’s say we want to perform a task after every 3 minutes.

setRepeating() allows to schedules an alarm with exact repeating time.

AlarmManager mgr=(AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                              180000+System.currentTimeMillis(),
                                  getPendingIntent(ctxt));

and you can get pending intent

// Specify ur receiver
    private PendingIntent getPendingIntent(Context ctxt) {
        Intent i=new Intent(ctxt, APIReceiver.class);
        return(PendingIntent.getBroadcast(ctxt, 0, i, 0));
    }

You can stop alarm manager by calling:

public void stopAlarmManager()
{          
    if(alarmMgr != null)
       alarmMgr.cancel(pendingIntent);
}
Rissmon Suresh
  • 13,173
  • 5
  • 29
  • 38