IntentService está congelando minha interface do usuário do aplicativo

No meu aplicativo, estou usando o Intentservice para buscar os dados do servidor e armazenar dados buscados no sqlite db local. Estou usando o 5 IntentService para buscar e preencher cinco tabelas. Os dados podem ter até 300 linhas para cada serviço de intenção. O que devo fazer?

Código IntentService:

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);


                            //Set the flag bit to 1 since data is already at server
                            long result=dbHelper.insertIntoBloodPressureDetails(childJSONObject.getInt("systolic"), childJSONObject.getInt("diastolic"),  childJSONObject.getLong("timestamp"),1 );

                           // Log.i("Insertion result ",Long.toString(result));
                        }

                        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);
                        //This is midnight time in GMT
                        long unixTimeStamp = c.getTimeInMillis();

                        //Convert it in to Indian time System
                        long indianMidNightTime=unixTimeStamp-19800000;

                        //Log.i("Now Calculates Days","doing");
                        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;
                //   Handle 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) {
                    //TODO
                    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"));
                        // Now you can use any deserializer to make sense of data
                        JSONObject obj = new JSONObject();

                        obj.put("New Error",res);

                        Log.i("New Server Error",obj.toString());
                    } catch (UnsupportedEncodingException e1) {
                        // Couldn't properly decode data to string
                        e1.printStackTrace();
                    } catch (JSONException e2) {
                        // returned data is not JSONObject?
                        e2.printStackTrace();
                    }
                } else if (error instanceof NetworkError) {
                    //TODO
                    error.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
                } else if (error instanceof ParseError) {
                    //TODO
                    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 {
                    // Parsing json object response
                    // response will be a json object

                    //Toast.makeText(getApplicationContext(),response.toString(),Toast.LENGTH_LONG).show();

                    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) {

                //   Handle 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) {
                    //TODO
                    error.printStackTrace();
                    Toast.makeText(getApplicationContext(), "User not authorized", Toast.LENGTH_SHORT).show();
                } else if (error instanceof ServerError) {
                    //TODO
                    error.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Server error", Toast.LENGTH_SHORT).show();
                } else if (error instanceof NetworkError) {
                    //TODO
                    error.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
                } else if (error instanceof ParseError) {
                    //TODO
                    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);
    }


}

Código para chamar intentservice:

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);

e intenção me envie o código quando concluir a tarefa

No onReceiveResult .., o código de resultado é enviado pelo serviço de chamada intent e, quando a contagem chega a 5, inicia a atividade principal (embora esse truque não esteja funcionando, ou seja, iniciar a atividade principal sem concluir a tarefa atribuída ao serviço intents).

@Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        // TODO Auto-generated method stub

        Log.d("Diabetes","received result from Service= "+resultData.getString("ServiceTag"));
       // Log.d("BMI ","received result from Service= "+resultData.getString("ServiceTag"));

       /* if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }*/

        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();
        }

    }

questionAnswers(1)

yourAnswerToTheQuestion