IntentService freezes my user interface

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


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


}

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

    }
+1
source share
1

, IntentService ? , (UI) , - .

, . , ResultReceiver IntentService onReceiveResult ?

, , , , , . (.. Loader - ) , , .

, , . , , Volley. Volley, . , queue . , ResultReceiver, , , , . , , MainActivity . .

. Volley , - . . , , ( ..), (UI). .

, , , , Volley RequestFuture. , , . (JSONObject ) , . , , get . , . , , .

, , , Response.Listener. (.. - ), , .

- , , , , .

, , , .

+2

All Articles