Question

I have an app and whenever a user starts the app it creates a new entry in the database. Besides, there should be a function that deletes the registry of the user when the user quits. For these 2 functions I have 2 asynctasks. the first one is working fine , which creates the user in the database. However, although there are no errors, the asynctask which should delete the user does nothing when onDestroy() is called. I have tested with onPause() and the app deletes the user but I dont know why is not working onDestroy(). Here is the relevant code I use:

 public class Titulacion extends Activity {

    @Override
public void onDestroy(){
super.onDestroy();
new Borrar().execute();
//  UIHelper.killApp(true);
    }

    public static int titulacion;
    Button bAceptar;
    RadioGroup radGrp;
    RadioButton radBot1;
    RadioButton radBot2;
    RadioButton radBot3;
    RadioButton radBot4;
    ImageButton bAdmin;
    static int nTest = 0;
    private ProgressDialog pDialog;
    private static final String TAG_SUCCESS = "success";
    JSONParser jsonParser = new JSONParser();
    private static final int DIALOG_CONFIRMAR_USUARIO = 0;
    int level = -1;
    String levelstring;
    int pid;
    static String pids;
    BroadcastReceiver batteryReceiver;
    String url = "10.0.0.13";
    private static String url_crear = "http://10.0.0.13/subida/create_candidato.php";
    private static final String url_delete = "http://10.0.0.13/subida/delete_candidato.php";

    @SuppressLint("NewApi")
    static String device_id = Build.SERIAL;
    static String PDA = device_id.substring(device_id.length() - 6);


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.titulacion);
        batteryReceiver = new BroadcastReceiver() {
            int scale = -1;
            int voltage = -1;
            int temp = -1;
            @Override
            public void onReceive(Context context, Intent intent) {
                level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
                levelstring = String.valueOf(level)+"%";
                scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
                temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
                voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
            }
        };
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(batteryReceiver, filter);




        radGrp = (RadioGroup) findViewById(R.id.titGroup);
        radBot1 = (RadioButton) findViewById(R.id.bot_superior);
        radBot2 = (RadioButton) findViewById(R.id.bot_medio);
        radBot3 = (RadioButton) findViewById(R.id.bot_tecnico);
        radBot4 = (RadioButton) findViewById(R.id.bot_administrativo);
        bAdmin = (ImageButton) findViewById(R.id.administradorinit);
        bAceptar = (Button) findViewById(R.id.BtnAceptar);
        StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

        boolean isReachable = false;
        try{
            isReachable = InetAddress.getByName("10.0.0.13").isReachable(1000);
        } catch (Exception e){
            Log.e("InetAddress", e.getMessage());




        }finally {
            if (isReachable) {
                new CreateCandidato().execute();


            }else{
                Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show();
            }

        }


        bAceptar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (radBot1.isChecked()) {
                    titulacion = 1;
                    Intent i = new Intent(Titulacion.this, Ident.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                } else if (radBot2.isChecked()) {
                    titulacion = 2;
                    Intent i = new Intent(Titulacion.this, Ident.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }

                else if (radBot3.isChecked()) {

                    titulacion = 3;
                    Intent i = new Intent(Titulacion.this, MenuInterna.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }

                else if (radBot4.isChecked()) {
                    titulacion = 4;
                    Intent i = new Intent(Titulacion.this, MenuSup.class);
                    startActivity(i);
                    unregisterReceiver(batteryReceiver);

                }
            }
        });
        bAdmin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Titulacion.this, Admin.class);
                startActivity(i);
                unregisterReceiver(batteryReceiver);

            }
        });
    }
    class CreateCandidato extends AsyncTask<String, String, String> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Titulacion.this);
            pDialog.setMessage("Actualizando ..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }


        protected String doInBackground(String... args) {

            try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("nserie", PDA));
            params.add(new BasicNameValuePair("bateria", levelstring));


            JSONObject json = jsonParser.makeHttpRequest(url_crear,
                    "POST", params);

            Log.d("Create Response", json.toString());



                pid = json.getInt("id");
                pids = String.valueOf(pid);


                int success = json.getInt(TAG_SUCCESS);


            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();


        }

    }
    class Borrar extends AsyncTask<String, String, String> {


        @Override
        protected void onPreExecute() {

        super.onPreExecute();
        Log.d("LLEGA1", "LLEGA1");

    }


        protected String doInBackground(String... args) {

            // Check for success tag
            int success;
            try {

            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {


                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("id", Titulacion.getPID()));


                JSONObject json = jsonParser.makeHttpRequest(
                        url_delete, "POST", params);


                Log.d("Delete Product", json.toString());

                success = json.getInt("success");

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }


        protected void onPostExecute(String file_url) {
            Log.d("llega", "LLEGA");



        }

    }

Thank you for your help

Was it helpful?

Solution

Your Activity gets destroyed but the AsyncTask is doing its job(working in background). There won't be any ANR because you are not doing any background stuff on the UI. If you are updating any view on your UI after AsyncTask is completed then there would a NULLPOINTER Exception . But, this would not be a good idea to run AsyncTask in onDestroy().

use asyntask in onDestroy() instead you can have an activity that extends IntentService and give a call to that activity from onDestroy

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top