In my application, I use Intentservice to retrieve data from the server and store the retrieved data in a local sqlite db. I use 5 IntentService to retrieve and populate five tables. Data can contain up to 300 rows for each Intent service. What should I do?
IntentService Code:
public class SendBpRecordServer extends IntentService {
DbHelper dbHelper;
public static final String TAG="BP Service";
public JSONObject finalData;
public SendBpRecordServer() {
super("BP");
dbHelper=new DbHelper(this);
Log.i("In Constructor",TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String recName=intent.getStringExtra("nameTag");
if (recName.equals("fetch"))
{
Log.i("Send Data","Yes");
fetchDatFromServer();
ResultReceiver resultReceiver=intent.getParcelableExtra("receiverTagBP");
Log.d("BP Reseult ",resultReceiver.toString());
Bundle bun= new Bundle();
bun.putBoolean("Process_Complete_bp",true);
resultReceiver.send(2, bun);
}
else {
Log.i("Inside Service PUT BP ","Yes");
dataCollected();
}
}
private void fetchDatFromServer() {
Response.Listener listener=new Response.Listener<JSONObject>()
{
@Override
public void onResponse(JSONObject response) {
Log.i("Json Array Response", response.toString());
try
{
Boolean responseStatusCondition=response.getBoolean("success");
if (responseStatusCondition)
{
JSONArray jsonArray=response.getJSONArray("response");
Log.i("Array Size is",Integer.toString(jsonArray.length()));
for (int i=0;i<jsonArray.length();i++)
{
JSONObject childJSONObject = jsonArray.getJSONObject(i);
long result=dbHelper.insertIntoBloodPressureDetails(childJSONObject.getInt("systolic"), childJSONObject.getInt("diastolic"), childJSONObject.getLong("timestamp"),1 );
}
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
long unixTimeStamp = c.getTimeInMillis();
long indianMidNightTime=unixTimeStamp-19800000;
dbHelper.calculateDays(dbHelper.bpTableName, dbHelper.bpCOLUMN_days, dbHelper.bpCOLUMN_timestamp, indianMidNightTime);
}
}catch (JSONException js)
{
js.printStackTrace();
}
}
};
Response.ErrorListener errorListener=new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
NetworkResponse response = error.networkResponse;
if (error instanceof TimeoutError || error instanceof NoConnectionError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), " this Network Error", Toast.LENGTH_SHORT).show();
} else if (error instanceof AuthFailureError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "User not authorized", Toast.LENGTH_SHORT).show();
} else if (error instanceof ServerError && response != null)
{
try {
String res = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, "utf-8"));
JSONObject obj = new JSONObject();
obj.put("New Error",res);
Log.i("New Server Error",obj.toString());
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (JSONException e2) {
e2.printStackTrace();
}
} else if (error instanceof NetworkError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
} else if (error instanceof ParseError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "Error consuming request", Toast.LENGTH_SHORT).show();
}
else error.printStackTrace();
}
};
String bp_url=Constants.url+"bp";
JsonObjectHeader customRequest=new JsonObjectHeader(bp_url, null, listener, errorListener);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(customRequest);
}
private void dataCollected() {
JSONArray jsonArray=new JSONArray();
ArrayList<Graph> arrayList=dbHelper.fetchDataFromBp();
for (int i=0;i<arrayList.size();i++)
{
Graph graph=new Graph();
graph=arrayList.get(i);
try {
JSONObject jsonObject=new JSONObject();
jsonObject.put("systolic",graph.getHeight());
jsonObject.put("diastolic",graph.getWeight());
jsonObject.put("timestamp",graph.getTime());
jsonArray.put(jsonObject);
}catch (JSONException js)
{
js.printStackTrace();
}
}
finalData=new JSONObject();
try {
finalData.put("bp",jsonArray);
}catch (JSONException js)
{
js.printStackTrace();
}
sendDatatoServer();
}
private void sendDatatoServer()
{
Response.Listener listener=new Response.Listener<JSONObject>()
{
@Override
public void onResponse(JSONObject response) {
try {
Boolean responseStatusCondition = response.getBoolean("success");
Log.i("Response BP",responseStatusCondition.toString());
if (responseStatusCondition)
dbHelper.setTheFlagBpTable();
else
Log.i("Something Went Wrong"," On Server");
}
catch (JSONException k)
{
Log.i("On Response",k.getMessage());
k.printStackTrace();
}
}
};
Response.ErrorListener errorListener=new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error instanceof TimeoutError || error instanceof NoConnectionError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), " this Network Error", Toast.LENGTH_SHORT).show();
} else if (error instanceof AuthFailureError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "User not authorized", Toast.LENGTH_SHORT).show();
} else if (error instanceof ServerError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "Server error", Toast.LENGTH_SHORT).show();
} else if (error instanceof NetworkError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
} else if (error instanceof ParseError) {
error.printStackTrace();
Toast.makeText(getApplicationContext(), "Error consuming request", Toast.LENGTH_SHORT).show();
}
else error.printStackTrace();
}
};
Log.i("Bp Final Data",finalData.toString());
JsonObjectHeader customRequest=new JsonObjectHeader(Request.Method.PUT, Constants.url+"bp", finalData, listener, errorListener);
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(customRequest);
}
}
Code for calling intenservice:
Log.i("Fetch BP Data ", SendBpRecordServer.TAG);
resultReceiverBP=new MyResultReceiver(new Handler());
resultReceiverBP.setReceiver(this);
Log.i("Bp resultreceiver ",resultReceiverBP.toString());
Intent intent2=new Intent(this,SendBpRecordServer.class);
intent2.putExtra("nameTag","fetch");
intent2.putExtra("receiverTagBP",resultReceiverBP);
startService(intent2);
and the intention to send me the code when it completes the task
In onReceiveResult .., the resultcode is sent through the intentservice calling agent, and when the counter goes to 5, and then receives the main activity (although this trick does not work, i.e. it starts mainactivity without executing the task assigned to the intenservice).
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
Log.d("Diabetes","received result from Service= "+resultData.getString("ServiceTag"));
Log.i("Get Values ",Integer.toString(Constants.getValues));
if (resultCode==0 && resultData.getBoolean("Process_Complete"))
Constants.getValues++;
if (resultCode==1 && resultData.getBoolean("Process_Complete_bmi"))
Constants.getValues++;
if (resultCode==2 && resultData.getBoolean("Process_Complete_bp"))
Constants.getValues++;
if (resultCode==3 && resultData.getBoolean("Process_Complete_med_stats"))
Constants.getValues++;
if (resultCode==4 && resultData.getBoolean("Process_Complete_one"))
Constants.getValues++;
if (Constants.getValues==5)
{
Constants.getValues=0;
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
startActivity(new Intent(this,MainActivity.class));
finish();
}
}